11 nginx之四層負載均衡
阿新 • • 發佈:2021-11-02
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()");
}
}