bean的延迟加载
需要声明一点, 按照之前的例子来讲, User默认情况下是在容器初始化的过程中被创建的, 也就是默认并没有使用延迟加载
所有的bean在默认情况下都是非延迟加载的, 容器创建bean就会被创建, 并且是单例的, 单例后续再讲
此时的配置文件是:
<?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-3.2.xsd">
<bean id="user" class="com.rl.spring.model.User" ></bean>
</beans>
如要配置成延迟加载状态 只需添加lazy-init=true属性即可
<?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-3.2.xsd">
<bean id="user" class="com.rl.spring.model.User" lazy-init="true"></bean>
</beans>
如需配置全局, 还可设置默认为延迟加载
<?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-3.2.xsd" default-lazy-init="true">
<bean id="user" class="com.rl.spring.model.User" ></bean>
<bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
</beans>
bean的作用域
此时涉及到单例(singleton)或者是多例(prototype), 默认情况下是单例的形式
单例的情况下是不管怎么getBean都只会得到一个实例, 单例可设置延迟加载或非延迟加载(默认情况), 如图
测试类:
package com.rl.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rl.spring.model.User;
public class TestSpring {
@Test
public void test() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[]{"ApplicationContext1.xml"});
User user = (User) ctx.getBean("user");
User user1 = (User) ctx.getBean("user");
System.out.println(user);
System.out.println(user1);
}
}
输出:
com.rl.spring.model.User@650e52
com.rl.spring.model.User@650e52
多例的情况是必须"延迟加载", 因为容器不知道要给你创建多少个实例, 所以只能延迟加载, 等到你需要创建该实例的时候再给你创建即可
<?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-3.2.xsd" >
<bean id="user" class="com.rl.spring.model.User" scope="prototype"></bean>
</beans>
bean的生命周期
生命周期因延迟加载跟非延迟加载而不同 下面进行测试
在User中定义两个方法 init() 和 destroy()
package com.rl.spring.model;
public class User {
private Integer userId;
private String username;
public User() {
System.out.println("user被创建");
}
public void init(){
System.out.println("我出来了");
}
public void destroy(){
System.out.println("20年后又是一条好汉");
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
在配置文件中设置这两个方法
<?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-3.2.xsd" >
<!-- <bean id="user" class="com.rl.spring.model.User" scope="prototype"></bean> -->
<bean id="user" class="com.rl.spring.model.User" init-method="init" destroy-method="destroy"></bean>
</beans>
设置好之后, 运行测试代码
package com.rl.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rl.spring.model.User;
public class TestSpring {
@Test
public void test() {
ApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[]{"ApplicationContext1.xml"});
User user = (User) ctx.getBean("user");
//强制转换为其子类, 这样才能进行close容器
AbstractApplicationContext actx = (AbstractApplicationContext)ctx;
//关闭容器
actx.close();
}
}
此时当默认非延迟加载创建容器的时候, 实例bean被创建出来, 之后init方法被调用, 当容器被关闭(销毁), 之后调用destroy方法