1. 程式人生 > 其它 >11 nginx之四層負載均衡

11 nginx之四層負載均衡

1 概念

spring  不是一個功能性框架 一種設計層面的框架
spring核心:ioc和aop
IOC:控制反轉 Inversion of Control
    spring把程式所依賴所有物件的建立、初始化、分配、管理、銷燬等工作交給spring容器
    物件的所有控制權交給了spring容器  而不再是由程式做主
DI:依賴注入Dependency injection   
   在執行時期  spring容器把程式依賴的物件動態的注入到程式中 

2 ioc案例1

建立java專案

匯入jar包

logging-1.1.1.jar:日誌jar
log4j-1.2.15.jar:日誌jar
asm-3.0.1.RELEASE-A.jar:位元組碼檔案解析jar
RELEASE-A.jar:javabean實體類依賴的jar
context-3.0.1.RELEASE-A.jar:spring功能控制jar---驗證/jmail
core-3.0.1.RELEASE-A.jar:springioc核心jar
expression-3.0.1.RELEASE-A.jar:spring表示式依賴的jar

建立srping的核心配置檔案

spring_ioc_core.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans 	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<!-- xsd檔案對當前xml檔案進行語法檢查 :規定有哪些標籤 有哪些屬性 標籤的巢狀關係-->
	
</beans>

建立實體類

public class Student {
    private Integer sid;
    private String sname;
    private String sex;
    private Integer sage;
    private Boolean sdy;
    ...
}

在核心配置檔案中通過bean標籤來建立物件

<!-- 通過bean標籤建立程式依賴的物件 -->
<!-- Integer sid, String sname, String sex, Integer sage, Boolean sdy -->
<bean name="s1" class="com.zhiyou100.ioc.day01.Student">
    <property name="sid"  value="1001"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
</bean>
<bean name="s2" class="com.zhiyou100.ioc.day01.Student">
    <constructor-arg  index="0"  value="1002" />
    <constructor-arg  index="2"  value="韓紅" />
    <constructor-arg  index="1"  value="女" />
    <constructor-arg  index="4"  value="false" />
    <constructor-arg  index="3"  value="33" />
</bean>

測試類

//建立spring上下文物件  關聯核心配置檔案
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("com/zhiyou100/ioc/day01/spring_ioc_core_01.xml");
//通過上下文物件的getbean方法 由bean的name值獲取javabean物件
Student stu1=(Student)context.getBean("s1");
System.out.println(stu1);
Student stu2=(Student)context.getBean("s2");
System.out.println(stu2);
context.close();

3 研究springioc

3.1spring建立bean的特點

1:預設情況下 專案啟動:spring容器讀取核心配置檔案 就建立bean標籤對應的javabean物件
2:spring中bean標籤是單例物件:一個bean標籤預設只建立一個物件
  同一個bean標籤呼叫多次 建立的是同一個物件
3:預設呼叫實體類的無引數的構造方法建立物件:如果沒有無引數的構造方法:丟擲異常:NoSuchMethodException
4:如果bean標籤中是property標籤:javabean通過set方法給屬性賦值
  如果bean標籤中是constructor-arg標籤:javabean通過構造方法引數列表給屬性賦值 

3.2獲取springcontent的方式

//建立spring上下文物件  關聯核心配置檔案
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("com/zhiyou100/ioc/day01/spring_ioc_core_01.xml");
//通過上下文物件的getbean方法 由bean的name值獲取javabean物件
Student stu1=(Student)context.getBean("s1");
System.out.println(stu1);
context.close();

//建立spring上下文物件方式2:FileSystemXmlApplicationContext
FileSystemXmlApplicationContext context2=new FileSystemXmlApplicationContext("src/com/zhiyou100/ioc/day01/spring_ioc_core_01.xml");
Student stu4=(Student)context2.getBean("s1");
System.out.println(stu4);
context.close();

3.3多個核心配置檔案

  • 方式1:ClassPathXmlApplicationContext的引數是不定引數 可以指定多個配置檔案的路徑
//多個spring核心配置檔案
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("com/zhiyou100/ioc/day01/spring_ioc_core_01.xml","com/zhiyou100/ioc/day01/spring_ioc_core_02.xml");
  • 方式2:在主配置檔案中通過import標籤引入所有的其他配置檔案
<import resource="spring_ioc_core_02.xml"/><!-- 相對於當前配置檔案的目錄 -->

3.4 給屬性賦值方式

  • 通過set方法給屬性賦值:呼叫的property標籤
<bean name="s1" class="com.zhiyou100.ioc.day01.Student">
    <property name="sid"  value="1001"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
</bean>
  • 通過構造方法引數列表給屬性賦值:呼叫constructor-arg標籤
<bean name="s1" class="com.zhiyou100.ioc.day01.Student">
    <constructor-arg  index="0"  value="1002" />
    <constructor-arg  index="2"  value="韓紅" />
    <constructor-arg  index="1"  value="女" />
    <constructor-arg  index="4"  value="false" />
    <constructor-arg  index="3"  value="33" />
</bean>

3.5 bean關聯

  • 實體類Teacher
public class Teacher implements Serializable{//注意實現序列化
	private Integer tid;
	private String tname;
	private String tsex;
    ...
}
  • 實體類Student
public class Student implements Serializable{
    private Integer sid;
    private String sname;
    private String sex;
    private Integer sage;
    private Boolean sdy;
    //定義引用記錄當前學生的老師
    private Teacher  teacher;
    ...
}
  • 配置bean
<bean name="s1" class="com.zhiyou100.ioc.day02.Student">
    <property name="sid"  value="1001"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
    <!-- 給teacher屬性賦值:private Teacher  teacher -->
    <!-- property和constructor-arg標籤的value屬性:給單值資料(基本資料型別+字串)賦值 -->
    <!-- property和constructor-arg標籤的ref屬性:給引用型別資料(物件型別)賦值 -->
    <property name="teacher" ref="t1"/>
</bean>

<bean name="t1" class="com.zhiyou100.ioc.day02.Teacher">
    <property name="tid"  value="1"/>
    <property name="tname"  value="張老師"/>
    <property name="tsex"  value="男"/>
</bean>

3.6 bean作用域

<!-- bean的作用域:通過scope屬性制定 -->
<!-- scope屬性的值:
      singleton:單例  每次呼叫此bean獲取的永遠是同一個物件 (預設)
      prototype:多例  每次呼叫bean 獲取都是新的物件
      request: 適用於web專案:同一個請求鏈 呼叫同一個bean獲取的是同一個物件
      session: 適用於web專案:同一個回話 呼叫同一個bean獲取的是同一個物件
      global-session: 適用於web專案:同一個servletcontext 呼叫同一個bean獲取的是同一個物件
  -->
<bean name="s2" class="com.zhiyou100.ioc.day02.Student" scope="prototype">
    <property name="sid"  value="1001"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
</bean>

3.7 bean懶載入

<!-- bean的懶載入:預設情況下scope=singleton的bean 專案啟動spring容器載入核心配置檔案就會建立bean對應的物件 
      開頭通過lazy-init="true"屬性來指定 bean標籤第一次被呼叫時才建立物件
 -->
<bean name="s3" class="com.zhiyou100.ioc.day02.Student" scope="singleton" lazy-init="true">
    <property name="sid"  value="1003"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
</bean>

3.8 bean生命週期

物件建立 物件初始化 物件呼叫 物件銷燬

  • 實體類Student

public class Student implements Serializable{
	public void init(){
		System.out.println("初始化方法:++++++:public void init()");
	}
	public void destory(){
		System.out.println("銷燬方法::------:public void destory()");
	}
    。。。
}
  • bean配置
<!-- bean的生命週期:
   bean物件建立完後會立刻呼叫init-method屬性對應的方法進行物件的初始化
   springcontext關閉之前會呼叫destroy-method屬性對應的方法進行物件的銷燬
  -->
<bean name="s4" class="com.zhiyou100.ioc.day02.Student"  init-method="init" destroy-method="destory">
    <property name="sid"  value="1003"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
</bean>

3.9 bean的集合屬性

  • 實體類
public class Worker  implements Serializable{
	 private Integer wid;
	 private Teacher teacher;
	 private int[] arrInt;
	 private Teacher[] arrTea;
	 private List<Teacher> listTea;
	 private List<Integer> listInt;
	 private Set<Integer> setInt;
	 private Map<String, Teacher> map;
    ...
}
  • 配置檔案
<!-- 集合型別的屬性-->
<bean name="tea1" class="com.zhiyou100.ioc.day02.Teacher">
    <property name="tid" value="11"/>
    <property name="tname" value="高老師"/>
    <property name="tsex" value="男"/>
</bean>
<bean name="tea2" class="com.zhiyou100.ioc.day02.Teacher">
    <property name="tid" value="12"/>
    <property name="tname" value="田老師"/>
    <property name="tsex" value="男"/>
</bean>
<bean name="tea3" class="com.zhiyou100.ioc.day02.Teacher">
    <property name="tid" value="13"/>
    <property name="tname" value="陳老師"/>
    <property name="tsex" value="女"/>
</bean>

<bean name="w1" class="com.zhiyou100.ioc.day02.Worker">
    <!-- 	     	 private Integer wid; -->
    <property name="wid" value="1001"/>
    <!-- 			 private Teacher teacher; -->
    <property name="teacher" ref="tea1"/>
    <!-- 			 private int[] arrInt; -->
    <property name="arrInt">
        <array value-type="int">
            <value>111</value>
            <value>112</value>
            <value>113</value>
            <value>114</value>
        </array>
    </property>

    <!-- 			 private Teacher[] arrTea; -->
    <property name="arrTea">
        <array value-type="com.zhiyou100.ioc.day02.Teacher">
            <ref bean="tea1"/>
            <ref bean="tea2"/>
            <ref bean="tea3"/>
        </array>
    </property>

    <!-- 			 private List<Teacher> listTea; -->
    <property name="listTea">
        <list value-type="com.zhiyou100.ioc.day02.Teacher">
            <ref bean="tea1"/>
            <ref bean="tea2"/>
            <ref bean="tea3"/>
            <ref bean="tea1"/>
            <ref bean="tea2"/>
            <ref bean="tea3"/>
        </list>
    </property>

    <!-- 			 private List<Integer> listInt; -->
    <property name="listInt">
        <list value-type="java.lang.Integer">
            <value>21</value>
            <value>31</value>
            <value>41</value>
        </list>
    </property>

    <!-- 			 private Set<Integer> setInt; -->
    <property name="setInt">
        <set value-type="java.lang.Integer">
            <value>22</value>
            <value>32</value>
            <value>42</value>
            <value>22</value>
            <value>32</value>
            <value>42</value>
        </set>
    </property>

    <!-- 			 private Map<String, Teacher> map; -->
    <property name="map">
        <map key-type="java.lang.String" value-type="com.zhiyou100.ioc.day02.Teacher">
            <entry key="key1" value-ref="tea1"/>
            <entry key="key2" value-ref="tea2"/>
            <entry key="key3" value-ref="tea3"/>
        </map>
    </property>
</bean>

3.10 工廠模式

目標物件的建立 由factory類的方法來實現

例項工廠模式:提供建立目標物件的工廠方法是例項方法

  • 例項工廠類
public class FactoryInstance implements Serializable{
	public Teacher getInstance(){
		Teacher t=new Teacher();t.setTid(1);t.setTname("韓梅梅");t.setTsex("女");
		return t;
	}
}
  • 配置
<!-- 例項工廠模式 -->
<!-- 建立bean:獲取例項工廠物件 -->
<bean name="factoryInstance"  class="com.zhiyou100.ioc.day02.FactoryInstance"/>
<!-- 建立bean:呼叫例項工廠物件的方法獲取目標物件 -->
<bean  name="tea01" factory-bean="factoryInstance" factory-method="getInstance"/>

靜態工廠模式:提供建立目標物件的工廠方法是靜態方法

  • 靜態工廠類
public class FactoryStatic implements Serializable{
	public static Teacher getInstance(){
		Teacher t=new Teacher();t.setTid(1);t.setTname("韓梅梅");t.setTsex("女");
		return t;
	}
}
  • 配置
<!-- 靜態工廠模式 -->
<bean  name="tea02" factory-method="getInstance" class="com.zhiyou100.ioc.day02.FactoryStatic" />

3.11 自動裝配:自動關聯物件的屬性賦值

  • 實體類
public class Student {
    private Integer sid;
    private String sname;
    private String sex;
    private Integer sage;
    private Boolean sdy;
    private Teacher teacher;
    ...
}
  • 配置
<!-- autowire="byName":自動給物件型別的屬性賦值:bean名字和屬性名一致 -->
<bean name="s2" class="com.zhiyou100.ioc.day03.Student" autowire="byName">
    <property name="sid"  value="1003"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
    <!-- private Teacher teacher; -->
</bean>

<!-- autowire="byType":如果找到一個指定型別的bean 直接賦值
  如果找到多個 賦值bean的名字與屬性名相同的
  如果找到多個 但沒有bean的名字與屬性名字相同的  報錯:UnsatisfiedDependencyException
 -->
<bean name="s3" class="com.zhiyou100.ioc.day03.Student" autowire="byType">
    <property name="sid"  value="1003"/>
    <property name="sex"  value="男"/>
    <property name="sname"  value="韓梅梅"/>
    <property name="sage"  value="23"/>
    <property name="sdy"  value="true"/>
    <!-- private Teacher teacher; -->
</bean>

4 註解形式的ioc

4.1 匯入jar

註解的jar和配置的jar完全一樣

4.2 在核心配置檔案中引入context的名稱空間和xsd

<beans 	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!--名稱空間和xsd檔案都是複製修改的-->
</beans>

4.3 使用context標籤指定添加了註解的實體類的位置

<!-- 新增標籤指定添加註解的實體類位置 -->
<context:component-scan base-package="com.zhiyou100.ioc.day04"/>

4.4 在實體類上添加註解

package com.zhiyou100.ioc.day04;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.jws.soap.InitParam;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//@Repository    //建立bean的註解:給dao持久層的類新增的註解
//@Controller    //建立bean的註解:給controller控制層的類新增的註解
//@Service       //建立bean的註解:給service業務層的類新增的註解
@Component("s2")  //建立bean的註解:不確定當前bean具體屬於那一層  可以加屬性:用於指定bean的名字  不加預設是類名首字母小寫
//@Scope("prototype") //指定bean的作用域
@Lazy//懶載入  只適用於單例模式
public class Student {
    {
        System.out.println("構造程式碼塊!!");
    }
    //@Value("1001")給屬性賦值:可以載入屬性上  也可以加在set方法上
    @Value("1001")
    private Integer sid;
    @Value("韓庚")
    private String sname;
    @Value("男")
    private String sex;
    @Value("19")
    private Integer sage;
    private Boolean sdy;

    //@Autowired  //自動裝配:策略和byType類似
    //@Resource(name="teacher")//自動裝配:name指定bean的名字
    @Resource
    private Teacher teacher;
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    public Integer getSid() {
        return sid;
    }
    public void setSid(Integer sid) {
        this.sid = sid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getSage() {
        return sage;
    }
    public void setSage(Integer sage) {
        this.sage = sage;
    }
    public Boolean getSdy() {
        return sdy;
    }
    @Value("true")
    public void setSdy(Boolean sdy) {
        this.sdy = sdy;
    }	
    @Override
    public String toString() {
        return "Student [sid=" + sid + ", sname=" + sname + ", sex=" + sex + ", sage=" + sage + ", sdy=" + sdy
            + ", teacher=" + teacher + "]";
    }
    public Student(Integer sid, String sname, String sex, Integer sage, Boolean sdy) {
        super();
        this.sid = sid;
        this.sname = sname;
        this.sex = sex;
        this.sage = sage;
        this.sdy = sdy;
    }
    public Student() {
        super();
    }

    @PostConstruct
    public void initMethod(){
        System.out.println("public void initMethod()");
    }
    @PreDestroy
    public void destroyMethod(){
        System.out.println("public void destroyMethod()");
    }
}