Spring 注入不同作用域对象
来源:互联网 发布:c语言实现面向对象 编辑:程序博客网 时间:2024/06/15 12:14
– Start
当你想把短生命周期的对象(如: prototype)注入到长生命周期的对象(如:singleton)时需要特别注意,Spring 提供了如下的解决办法。
使用代理
package shangbo.spring.example29;public interface MessageService { String getMessage();}
package shangbo.spring.example29;public class MessageServiceImpl implements MessageService { private int times = 0; public String getMessage() { times++; return "Hello World-" + times; }}
package shangbo.spring.example29;public class MessagePrinter { final private MessageService service; public MessagePrinter(MessageService service) { this.service = service; } public void printMessage() { System.out.println(this.service.getMessage()); }}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 注意messageService对象是 prototype <aop:scoped-proxy/> 指示容器生成代理对象 --> <bean id="messageService" class="shangbo.spring.example29.MessageServiceImpl" scope="prototype"> <aop:scoped-proxy/> </bean> <!-- MessagePrinter 是 singleton 对象 --> <bean class="shangbo.spring.example29.MessagePrinter"> <constructor-arg ref="messageService"/> </bean></beans>
package shangbo.spring.example29;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App { public static void main(String[] args) { // 实例化 Spring IoC 容器 ApplicationContext context = new ClassPathXmlApplicationContext("example.xml", MessagePrinter.class); // 从容器中获得 MessagePrinter 的实例 MessagePrinter printer1 = context.getBean(MessagePrinter.class); printer1.printMessage(); // 再次在容器中获得 MessagePrinter 的实例 MessagePrinter printer2 = context.getBean(MessagePrinter.class); printer2.printMessage(); }}
使用 lookup 方法
package shangbo.spring.example30;public interface MessageService { String getMessage();}
package shangbo.spring.example30;public class MessageServiceImpl implements MessageService { private int times = 0; public String getMessage() { times++; return "Hello World-" + times; }}
package shangbo.spring.example30;public abstract class MessagePrinter { public void printMessage() { MessageService service = createMessageService(); System.out.println(service.getMessage()); } // 注意,这是传说中的 lookup 方法 protected abstract MessageService createMessageService();}
<?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"> <bean id="messageService" class="shangbo.spring.example30.MessageServiceImpl" scope="prototype"/> <!-- 注入 lookup 方法 --> <bean class="shangbo.spring.example30.MessagePrinter"> <lookup-method name="createMessageService" bean="messageService"/> </bean></beans>
package shangbo.spring.example30;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import shangbo.spring.example29.MessagePrinter;public class App { public static void main(String[] args) { // 实例化 Spring IoC 容器 ApplicationContext context = new ClassPathXmlApplicationContext("example.xml", MessagePrinter.class); // 从容器中获得 MessagePrinter 的实例 MessagePrinter printer1 = context.getBean(MessagePrinter.class); printer1.printMessage(); // 再次在容器中获得 MessagePrinter 的实例 MessagePrinter printer2 = context.getBean(MessagePrinter.class); printer2.printMessage(); }}
Spring 还提供了其他方法,如注入 ,或实现 ApplicationContextAware 接口,但是它们需要继承 Spring 的接口,与 Spring 耦合在一起,不推荐使用。
– 更多参见:Spring Framework 精萃
– 声 明:转载请注明出处
– Last Updated on 2017-05-23
– Written by ShangBo on 2017-05-23
– End
阅读全文
0 0
- Spring 注入不同作用域对象
- spring之注入不同作用域之间的bean
- 不同作用域(scope)的Spring Bean之间的依赖关系的动态代理注入
- Spring 对象作用域
- spring(bean初始化、销毁、注入,作用域)
- Spring对象的作用域
- Spring Controller 如何对不同对象中相同的属性名注入不同的值
- Spring -------集合对象注入
- Spring对象属性注入
- Spring 对象属性注入
- spring注入成员对象
- spring 有参构注入对象。
- Spring 注入ApplicationContext 对象
- spring 有参构注入对象。
- Spring注入依赖对象
- Spring注入依赖对象
- Spring 注入其他对象
- spring之注入对象
- scp命令在两服务器间传输文件
- codeforces 632A Grandma Laura and Apples 模拟
- 出现java.sql.SQLException: No suitable driver的几种解决办法
- Angular配置Router(路由)提示Controller NaNunction/undefined错误
- 超好用的一个JQUERY分页器-jpaginate
- Spring 注入不同作用域对象
- 用集合实现学生管理系统-2
- JVM内存区域划分 (粗略认识介绍)
- synchronized关键字与对象锁
- 另类的Linq To Sql——CoolEntity 之 横空出世
- codeforces 628C Bear and String Distance 水
- C语言入门
- 案例-----新闻客户端
- web前端之自动提示的文本框