IOC&DI即控制反转与依赖注入。是Spring的一大特性。
BeanFactory为Spring实现IOC的接口,可以将BeanFactory看作IOC容器。由于BeanFactory有相关缺陷,衍生出更强大的子接口,ApplicationContext为BeanFactory子接口。
下面对IOC的使用进行详解
首先为Bean
public class User {
private String name;
private int age;
public User() {
super();
}
public User(int age) {
super();
this.age = age;
}
public User(String name) {
super();
this.name = name;
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
public class Student {
private String id;
private User user;
public Student() {
super();
}
public Student(String id, User user) {
super();
this.id = id;
this.user = user;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Student [id=" + id + ", user=" + user + "]";
}
}
然后创建applicationContext.xml对Bean进行配置
一个<bean>标签意味着要向IOC容器中注入一个类。
注入主要分为两种方式:
- 构造器注入
- set方法注入
例1
<!-- property:指定属性名进行set注入 -->
<bean id="user" class="spring.bean.User">
<property name="name" value="konaji"></property>
<property name="age" value="30"></property>
</bean>
public static void test1 (){
/**
* ApplicationContext : Spring的IOC容器
* ClassPathXmlApplicationContext为IOC的实现类之一,读取的XML配置的Bean
*/
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
//User [name=konaji, age=30]
}
例2
<!-- constructor-arg:根据构造进行注入 -->
<bean id="user1" class="spring.bean.User">
<constructor-arg value="konaji"></constructor-arg>
</bean>
public static void test2 (){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user1");
//User [name=konaji, age=0]
}
例3
<!--
constructor-arg:type:指定构造的类型
应用场景:构造方法(String s1,String s2,int i)
不指定type,会分别将konaji,20赋值给s1,s2
指定type,会分别将konaji,20赋值给s1,i
-->
<bean id="user2" class="spring.bean.User">
<constructor-arg value="konaji" type="java.lang.String"></constructor-arg>
<constructor-arg value="20" type="int"></constructor-arg>
</bean>
public static void test3 (){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user2");
//User [name=konaji, age=20]
}
例4
<!--
constructor-arg:index:指定构造方法中属性的位置
应用场景:构造方法(String s1,String s2,int i)
不指定index,会分别将konaji,20赋值给s1,s2
指定index,会分别将konaji,20赋值给s1,i
-->
<bean id="user3" class="spring.bean.User">
<constructor-arg value="konaji" index="0"></constructor-arg>
<constructor-arg value="20" index="1"></constructor-arg>
</bean>
public static void test4 (){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user3");
//User [name=konaji, age=20]
}
例5
<!-- 当类属性为另一个类时,可以使用ref,指向XML中配置的类ID进行注入 -->
<bean id="student" class="spring.bean.Student">
<property name="id" value="10000"></property>
<!-- user3指向前面配置的id为user3的bean -->
<property name="User" ref="user3"></property>
</bean>
public static void test5 (){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
//Student [id=10000, user=User [name=konaji, age=20]]
}
例6
<!-- 当类属性为另一个类时,可以使用ref,指向XML中配置的类ID进行注入 -->
<bean id="student1" class="spring.bean.Student">
<constructor-arg value="10000"></constructor-arg>
<!-- user3指向前面配置的id为user3的bean -->
<constructor-arg ref="user3"></constructor-arg>
</bean>
public static void test6 (){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student1");
//Student [id=10000, user=User [name=konaji, age=20]]
}