目录
spring ioc
1 控制反转,创建对象
1.1 无参构造函数
<!-- 注入接口 -->
<!-- 无参构造函数 -->
<!-- score 默认是单例模式 -->
<bean name="orderService" class="com.sys.yang.standard.OrderServiceImpl" scope="singleton"/>
1.2 set方式
<!-- 使用 set方式, 方法中不要提供有参构造器,如要要提供构造器,需要提供有参和无参的两种构造器,或者只提供一个无参构造器 -->
<bean name="orderManagerSet" class="com.sys.yang.standard.OrderManagerSet">
<property name="orderService" ref="orderService"/>
</bean>
1.3 工厂模式
<!-- 工厂模式 -->
<bean name="factherFactory" class="com.sys.yang.standard.factory.FactherFactory"/>
<!-- 创建出 Soon1 对象-->
<bean name="soon1" factory-bean="factherFactory" factory-method="getSoon1"/>
<!-- 创建出 Soon2 对象-->
<bean name="soon2" factory-bean="factherFactory" factory-method="getSoon2"/>
2 依赖注入
2.1 手动注入
2.1.1 有参构造函数注入
<!-- 有参构造函数 -->
<bean name="studentParam" class="com.sys.yang.standard2.Student">
<!-- 参数名称, 参数位置,参数类型, 参数值 -->
<!-- 参数位置, 参数类型,可以用指定,如果在没有冲突的情况下 -->
<!-- String 是引用的数据类型,需要些全路径 -->
<constructor-arg name="id" index="0" type="int" value="1"/>
<constructor-arg name="name" index="1" type="java.lang.String" value="zhangsan"/>
<constructor-arg name="age" index="2" type="java.lang.String" value="18"/>
</bean>
2.1.2 set方法注入
<!-- set 方式注入-->
<bean name="studentSet" class="com.sys.yang.standard2.Student">
<property name="id" value="1"/>
<property name="age" value="10"/>
</bean>
2.2 自动注入
2.2.1 set 方式自动注入
根据名称进行注入
<!-- 自动注入, 是根据 set 进行注入 -->
<!-- autowire byName 根据名字进行注入操作,只能自动注入自己写的实体对象 -->
<bean name="orderManagerAutoByName" class="com.sys.yang.standard.OrderManagerSet" autowire="byName"/>
根据类型进行注入
<!-- 自动注入, 是根据 set 进行注入 -->
<!-- 根据类型进行注入,只能自动注入自己写的实体对象 -->
<bean name="orderManagerAutoByType" class="com.sys.yang.standard.OrderManagerSet" autowire="byType"/>
2.2.2 有参构造函数自动注入
有参构造函数自动注入,需要保证有参构造函数的参数都存在,即该 xml 文件中 创建全部参数的 bean 对象
<!-- 自动注入, 是根据 参构造函数 进行注入 -->
<!-- 根据id 进行注入,id 没有找的时候根据 name 进行注入-->
<bean name="orderManagerAutoParam" class="com.sys.yang.standard.OrderManagerSet" autowire="constructor"/>
2.3 特殊构造函数注入
<!-- 特殊函数的构造器,准备参数 -->
<bean name="socre1" class="com.sys.yang.standard2.Score">
<!-- property 使用set方法注入 -->
<!-- <property name="type" value="java"/> -->
<!-- constructor-arg 使用 有参构造器进行注入 -->
<constructor-arg name="type" value="java"/>
<constructor-arg name="level" value="A"/>
</bean>
<bean name="socre2" class="com.sys.yang.standard2.Score">
<constructor-arg name="type" value="C++"/>
<constructor-arg name="level" value="B"/>
</bean>
<bean name="student" class="com.sys.yang.standard2.Student">
<property name="id" value="1"/>
<property name="age" value="10"/>
</bean>
<!-- 特殊函数的构造器,进行注入 -->
<bean name="studentDto" class="com.sys.yang.standard2.StudentDto">
<property name="scoreList">
<list value-type="com.sys.yang.standard2.Score">
<ref bean="socre1"/>
<ref bean="socre2"/>
</list>
</property>
<property name="stringArray">
<array>
<value>a</value>
<value>b</value>
<value>c</value>
</array>
</property>
<property name="student" ref="student"/>
</bean>
3 测试方法
@Test
public void test1() {
/**
* bean-service.xml 指代的是,xml 文件
* orderManagerSet 指代的是 bean 标签中的 name 的值
* <bean name="orderManagerSet" class="com.sys.yang.standard.OrderManagerSet">
* <property name="orderService" ref="orderService"/>
* </bean>
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("bean-service.xml");
OrderManagerSet orderManagerSet = (OrderManagerSet) ac.getBean("orderManagerSet");
orderManagerSet.getOrder();
}
注意测试的时候,xml 文件所在的 resource 文件夹,一定要手动的指定为 Resource Root ,否则的话,即使使用绝对路径在测试的时候,也会报 找不到 xml 文件的错误。
在写的时候,文件夹有点乱,如果直接拷贝 xml 的文件内容,需要手动的修改 class 的路径
需要用到的类对象
/**
* @author yangLongFei 2020-12-24-15:19
*/
public interface OrderService {
public void getOrder();
}
/**
* @author yangLongFei 2020-12-24-15:20
*/
public class OrderServiceImpl implements OrderService {
@Override
public void getOrder() {
System.out.println("this is com.sys.yang.standard.OrderServiceImpl.getOrder ");
}
}
/**
* @author yangLongFei 2020-12-24-15:48
*/
public class OrderManagerSet {
private OrderServiceImpl orderService;
/**
* 有参构造器
*/
public OrderManagerSet(OrderServiceImpl orderService) {
System.out.println("有参构造器,com.sys.yang.standard.OrderManagerSet.OrderManagerSet(com.sys.yang.standard.OrderServiceImpl)");
this.orderService = orderService;
}
/**
* 无参构造器
*/
public OrderManagerSet() {
System.out.println("无参构造器, com.sys.yang.standard.OrderManagerSet.OrderManagerSet()");
}
/**
* set 方法
*/
public void setOrderService(OrderServiceImpl orderService) {
System.out.println("set方法 com.sys.yang.standard.OrderManagerSet.setOrderService");
this.orderService = orderService;
}
public void getOrder() {
orderService.getOrder();
System.out.println("this is com.sys.yang.standard.OrderManagerSet");
}
}
/**
* @author yangLongFei 2020-12-24-20:34
*/
public interface Father {
void getSoon();
}
/**
* @author yangLongFei 2020-12-24-20:35
*/
public class Soon1 implements Father {
@Override
public void getSoon() {
System.out.println("this is com.sys.yang.standard.factory.Soon1");
}
}
/**
* @author yangLongFei 2020-12-24-20:35
*/
public class Soon2 implements Father {
@Override
public void getSoon() {
System.out.println("this is com.sys.yang.standard.factory.Soon2 !!!!!!!!!!!!!!!!!!!");
}
}
/**
* @author yangLongFei 2020-12-24-20:36
*/
public class FactherFactory {
public Father getSoon1() {
return new Soon1();
}
public Father getSoon2() {
return new Soon2();
}
}
/**
* @author yangLongFei 2020-12-24-16:52
*/
public class Score {
private String type;
private char level;
public Score() {
}
public Score(String type, char level) {
this.type = type;
this.level = level;
}
@Override
public String toString() {
return "Score{" +
"type='" + type + '\'' +
", level=" + level +
'}';
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getLevel() {
return level;
}
public void setLevel(char level) {
this.level = level;
}
}
/**
* @author yangLongFei 2020-12-24-16:10
*/
public class Student {
private int id;
private String name;
private String age;
private Score score;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age='" + age + '\'' +
", score=" + score +
'}';
}
public Student() {
System.out.println("student 无参构造函数 com.sys.yang.standard2.Student.Student()");
}
public Student(int id, String name, String age) {
System.out.println("student 有参构造函数 com.sys.yang.standard2.Student.Student(int, java.lang.String, java.lang.String)");
this.id = id;
this.name = name;
this.age = age;
}
public Student(int id, String name, String age, Score score) {
this.id = id;
this.name = name;
this.age = age;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Score getScore() {
return score;
}
public void setScore(Score score) {
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
import java.util.Arrays;
import java.util.List;
/**
* @author yangLongFei 2020-12-24-19:22
*/
public class StudentDto {
private Student student;
private List<Score> scoreList;
private String[] stringArray;
public StudentDto(Student student, List<Score> scoreList, String[] stringArray) {
this.student = student;
this.scoreList = scoreList;
this.stringArray = stringArray;
}
public StudentDto() {
}
@Override
public String toString() {
return "StudentDto{" +
"student=" + student +
", scoreList=" + scoreList +
", stringArray=" + Arrays.toString(stringArray) +
'}';
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Score> getScoreList() {
return scoreList;
}
public void setScoreList(List<Score> scoreList) {
this.scoreList = scoreList;
}
public String[] getStringArray() {
return stringArray;
}
public void setStringArray(String[] stringArray) {
this.stringArray = stringArray;
}
}