spring ioc原理
控制反转大概的流程如下:
为了解耦合,需要创建工厂类。
创建对象之后,创建xml配置文件,然后使用dom4j解析配置文件
再使用反射创建一个对象
spring ioc简单的例子
在这之前需要导入jar包。如果创建spring的项目,IDE会自动导入这些jar包
- 首先创建一个User类
package cn.itcast.ioc;
public class User {
public void add(){
System.out.println("add........");
}
}
- 创建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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--ioc入门-->
<bean id="user" class="cn.itcast.ioc.User"></bean>
</beans>
spring的对象都叫做bean
beans标签里面的内容是schema约束,编译器会自动生成,如果不能自动生成,那么可以复制过去。
后面的bean标签里面id是标识,后面的class里面是对应的类的完整路径
这样使用xml最大的好处就是:如果类名变化,或者类的路径变化,那么直接更改配置文件即可。
3. 使用ioc创建对象
package cn.itcast.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
@Test
public void testUser(){
//1 加载spring配置文件,根据配置创建对象
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
//2 得到配置文件对象
User user = (User) context.getBean("user");
System.out.println(user);
user.add();
}
}
运行单元测试可以看到结果:
可以看到输出了对象的地址
以及调用了对象的add方法。
Spring bean管理(xml方式)
bean实例化的方式
1.使用类的无参数构造创建(常用)
方式在前面已经说过。
比如之前说的这个就是直接调用类里面的无参数构造器(没有写,默认)
<bean id="user" class="cn.itcast.ioc.User"></bean>
如果类里面有有参构造,那么使用上面这个方法无法创建类
2. 使用静态工厂创建
在类里面创建静态方法,返回对象
首先创建一个类
package cn.itcast.bean;
public class Bean2 {
public void add(){
System.out.println("add.....");
}
}
然后创建一个静态的工厂方法
package cn.itcast.bean;
public class Bean2Factory {
//静态方法,返回bean2对象
public static Bean2 getBean2(){
return new Bean2();
}
}
最后在xml里面调用工厂方法
<bean id="bean2" class="cn.itcast.bean.Bean2Factory" factory-method="getBean2"></bean>
与无参数构造创建不同的是,这个里面多了一个factory-method,也就是调用工厂类里面的静态工厂方法。
测试:
package cn.itcast.bean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
@Test
public void testUser(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
Bean2 bean2 = (Bean2) context.getBean("bean2");
System.out.println(bean2);
bean2.add();
}
}
测试结果:
3. 使用实例工厂创建
将静态方法变为普通方法
使用factory-bean和factory-method来进行bean的管理
那么使用context.getBean(“bean3”)之后,返回的就是Bean3的对象。
在真正的开发中,一般使用第一种方法实现,使用无参构造。
Bean标签常用的属性
1. id属性
不能包含特殊的符号
2. class属性
所在对象类的全路径
3. name属性
功能和id属性是一样的。
id的属性值里面不能包含特殊符号,但是name里面是可以有特殊符号
一般不用
3. scope属性
singleton:默认值表示单例(对象只创建一次)
prototype:每次都会创建一个对象
request: 创建对象并放到request域里面
session:对象放在session域里面
globalSession:对象放在globalSession里面,登录一次之后所有的页面直接操作
@Test
public void testUser(){
//1 加载spring配置文件,根据配置创建对象
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
//2 得到配置文件对象
User user1 = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
System.out.println(user1);
System.out.println(user2);
}
可以看到,创建的两个对象地址是一样的, 因此是单例模式
加上多例模式之后,可以看到: