Spring学习之路-高级装配
来源:互联网 发布:mysql官网下载旧版本 编辑:程序博客网 时间:2024/06/07 01:48
综述
1 条件化bean-conditional
2 处理自动装配的歧义-主要涉及两个标签@primary,@Qualifier。
3 bean的作用域
4 运行注入 @value
1 条件化bean
- @Conditional注解后面的类会实现Condition接口,当@Conditional注解中指定的类为真时,spring容器才会创建MagicConfig的bean,才能够将MagicConfig类注入到其他的类中,当@Conditional注解指定类为false时,如果注入这个类就会报错。
@Configurationpublic class MagicExists { @Bean() @Conditional(MagicCondition.class) public MagicConfig magicBean() { return new MagicConfig(); }}
2处理自动装配的歧义
- 一个接口和四个接口的实现类和一个测试类,当运行测试方法时,会报错,因为存在3个满足条件的bean,spring容器也不知道去创建那个对象的bean,所以需要通过注解指定。
public interface Dessert { void sys();}public class Cake implements Dessert { public void sys() { System.out.println("Cake......."); }}@Component//@Primarypublic class Cookies implements Dessert{ public void sys() { System.out.println("Cookies......."); }}@Componentpublic class IceCream implements Dessert { public void sys() { System.out.println("ice......."); }}//test测试类public class Test extends BaseTestCase{ private Dessert dessert; public Dessert getDessert() { return dessert; } @Autowired //@Qualifier("iceCream") public void setDessert(Dessert dessert) { this.dessert = dessert; } @org.junit.Test public void test(){ dessert.sys(); }}
- 然后我在Cookies 类上面加了一个@Primary标签,发现不出现错误了,通过输出知道容器创建了Cookies 的bean。
- 当存在两个@Primary标签时,仍然会报错,因为容器发现了两个@Primary注解指定的类,
- 当用注解@Qualifier(“iceCream”)指定创建的bean时,出现多个@Primary会创建beanId为iceCream的bean,容器创建每个bean时都会创建一个beanId用于唯一指定一个bean,默认情况下为首字符小写的类名。
3 bean的作用域
- 默认的情况下spring创建的bean都是单例的,不管这个bean被注入过多少次,注入的都是这个bean。通过@Scope(“prototype”)注解指定bean的作用域。
- 单例(Singleton):在整个应用中之创建一个实例。
- 原型(ProtoType):每次注入或者通过Spring上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在WEB应用中,为每个会话创建bean的一个实例。
- 请求(Request):在WEB应用中,为每个请求创建一个bean实例。
- 扩展:请求和会话的区别:请求指从客户端发送请求到服务器处理请求结束,会话是用户的全局变量,只要页面不关闭一直有效,会话的过期时间是30min。
4 运行注入
- 通过Spring默认的Environment类,默认去读取去读取application.properties文件的配置,当通过@PropertySource指定了读取的配置类,当前类中的Environment类,读取的就是@PropertySource指定的类。
- @Value默认读取application.properties文件中的属性值,在一个@PropertySource(app.properties)指定读取的路径下的一个类,@Value读取的属性值如果在application.properties和app.properties同时存在与两个配置文件中,会优先读取application.properties配置中的属性值,如果application.properties没有@Value注解想读取的属性值,会去@PropertySource指定配置文件中读取这个属性,如果还没有,会报错,找不到到这个属性值。
@Configuration@PropertySource("classpath:/config/app.properties")public class ReadPropertiesConfig { @Autowired Environment evn; @Value("${magic}") private String str; public User getUserInfo() { System.out.println("@Value$取值+" + str); return new User("通过Environment获取配置值:" + evn.getProperty("name"), evn.getProperty("pwd")); } public void getActiveProfiles() { String str[] = evn.getActiveProfiles(); for (int i = 0; i < str.length; i++) { System.out.println(str[i]); } } public void getDefaultProfiles() { String name = evn.getProperty("name"); System.out.println("evn get name" + name); String str[] = evn.getDefaultProfiles(); for (int i = 0; i < str.length; i++) { System.out.println(str[i]); } }}
阅读全文
1 0
- Spring学习之路-高级装配
- 3.Spring学习笔记之高级装配
- Spring学习总结之高级装配
- Spring学习笔记(六) --- 装配Bean之高级装配
- Spring之高级装配
- Spring入门之高级装配
- Spring之高级装配(二)
- 一点一滴学习Spring(三)之bean高级装配
- Spring学习之路-装配Bean
- Spring学习笔记二:高级装配
- Spring入门之Bean高级装配
- Spring实战之三:高级装配
- spring学习之自动装配
- Spring Bean 高级装配
- spring(3)高级装配
- 【Spring 核心】高级装配
- Spring 高级装配
- Spring 高级装配
- UML认识
- 配置postfix和dovecot启用SSL以加密连接
- U-BOOT源码目录
- 直线搜索/一维搜索
- 微信小程序自定义组件Dialog
- Spring学习之路-高级装配
- Leetcode:713.Subarray Product Less Than K
- .NET-简单的委托实例
- Android activity的四种启动模式
- Oracle:聚合函数
- MyEclipse10的项目中把 java EE 5 Libraries 删掉后怎么重新导入
- volatile关键字解析
- UML交互图(顺序图和交互图)
- 设计模式【模板模式Template Pattern】