高级装配
-
bean 的作用域
- 单例(Singleton):在整个应用程序中,只创建bean 的一个实例
- 原型(Prototype):每次注入或通过spring 上下文获取时,都会创建一个新的bean 实例
- 会话(Session):在Web 应用中,为每个会话创建一个bean 实例
- 请求(request):在Web 应用中,为每个请求创建一个bean 实例
-
<bean> 中有一个属性是 scope ,其默认值为Singleton,一般项目还可以选prototype,web项目还可选session和request,可以直接在xml 文件中设置bean 是进行配置。
- singleton:Spring 会在上下文加载的时候,就创建bean 对象,并且默认所有的bean 对象都是单例存在的,不随获取次数的变化而变化,不随注入次数的变化而变化
- prototype:Spring 会在上下文加载的时候不会创建bean 对象,bean 对象的实例是在我们getBean()获取时才创建的,并且每次获取都会拿到不用的bean 对象
-
还可以在自动装配中配置scope属性,定义bean 的作用域
@Component // 下面是三种Scope 的配置方式 //@Scope("pototype") //@Scope(scopeName = "prototype") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class MessageService { public MessageService() { super(); System.out.println("messageservice"); } public String getMessage(){ return "helloworld"; } }
-
javaConfig中定义bean 的作用域
首先定义配置类,在配置类中添加@Bean 注解时,在其下方添加@Scope
@Configuration public class AppConfig { @Bean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public MessagePrinter messagePrinter(){ return new MessagePrinter(); } }
-
bean 对象的初始化和销毁
首先需要在类中创建两个函数,一个作为初始化方法,另一个作为销毁的方法,配置之后bean 对象在创建和销毁之前会调用相关的函数。
-
xml 文件
在创建bean 时,配置其中的lazy-init、destroy-method 和init-method 节点。
public void init(){ System.out.println("初始化方法。。。。"); } public void destroy(){ System.out.println("销毁函数。。。。"); }
<bean id="printer2" class="hello.MessagePrinter" lazy-init="true" destroy-method="destroy" init-method="init"/>
-
自动注解@PostConstructh 和@PreDestroy
@PostConstruct public void init(){ System.out.println("初始化方法。。。。"); } @PreDestroy public void destroy(){ System.out.println("销毁函数。。。。"); }
-
-
工厂方法在spring环境初始化成功后就会被调用(重点在xml 怎么调用工厂方法)
<!-- 静态工厂,createPrinter1是静态工厂方法--> <bean id="printer2" class="hello.MessagePrinter" factory-method="createPrinter1"/> <!--实例工厂,creatPrinter2是实例工厂方法,先创建factory-bean节点--> <bean id="printerFactory" class="hello.MessagePrinter"/> <bean id="printer3" factory-bean="printerFactory" factory-method="creatPrinter2"/>