Spring笔记——Spring高级配置
1、环境与profile
在开发软件的时候,有一个很大的挑战就是将应用软件从一个环境迁移到另一个环境,开发阶段中,某些环境相关做法可能并不适合迁移到生产环境,甚至即便迁移过去也无法正常运行。为此Spring可根据环境(在运行时)去决定该创建那个bean和不创建那个bean。这样同一个部署单元(可能是war文件)能够运用于所有的环境,没有必要进行重新构建。
例如:开发环境下的DataSource 用EmbeddedDatabaseBuilder 创建,生产环境下的DataSource用JndiObjectFactoryBean创建更加合理。
1.1、配置profile bean
在3.1版本中, Spring引入了bean profile的功能。要使用profile,你首先要将所有不同的bean定义整理到一个或多个profile之中,在将应用部署到每个环境时,要确保对应的profile处于激活(active)的状态。
- 通过Java配置类配置——@Profile
@Configurationpublic classDataSourceConfig {@Bean(destroyMethod="shutdown")@Profile("dev") //为dev profile装配的beanpublicDataSource embeddedDataSource() {return new...}@Bean@Profile("prod") //为prod profile装配的beanpublicDataSource jndiDataSource() {return new...} }
- 通过XML配置profile
<beans...><beansprofile="dev"><bean>...</bean></beans><beansprofile="qa"><bean>...</bean></beans><beansprofile="prod"><bean>...</bean></beans> </beans>
1.2、激活profile
Spring在确定哪个profile处于激活状态时,需要依赖两个独立的属性: spring.profiles.active和spring.profiles.default。如果设置了spring.profiles.active属性的话,那么它的值就会用来确定哪个profile是激活的。但如果没有设置spring.profiles.active属性的话,那Spring将会查找spring.profiles.default的值。如果spring.profiles.active和spring.profiles.default均没有设置的话,那就没有激活的profile,因此只会创建那些没有定义在profile中的bean。
有多种方式来设置这两个属性:
- 作为DispatcherServlet的初始化参数;
- 作为Web应用的上下文参数;
- 作为JNDI条目;
- 作为环境变量;
- 作为JVM的系统属性;
- 在集成测试类上,使用@ActiveProfiles注解设置。
例如:在Web应用的web.xml文件中设置默认的profile
<?xml version="1.0" encoding="UTF-8"?> <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5"><display-name>ssm-spring</display-name><context-param><!--为上下文设置默认profile--><param-name>spring.profiles.default</param-name><param-value>dev</param-value></context-param><!--springmvc前端控制器--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframwork.web.servlet.DispatcherServlet</servlet-class><init-param><!--为Servlet设置默认profile--><param-name>spring.profiles.default</param-name><param-value>dev</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app>
2、条件化的Bean
【条件】
- 希望一个或多个bean只有在应用的类路径下包含特定的库时才创建;
- 希望某个bean只有当另外某个特定的bean也声明了之后才会创建 ;
- 要求只有某个特定的环境变量设置之后,才会创建某个bean。
解决办法:Spring 4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上。如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略。
@Configuration @ComponentScanpublic classBeanConfig {@Bean@Conditional(MagicExistsCondition.class) // 设置创建bean的条件publicMagicBean magicBean() {return newMagicBean();} }public class MagicExistsCondition implementsCondition {public booleanmatches(ConditionContext context, AnnotatedTypeMetadata metadata) {Environment ev=context.getEnvironment();return ev.containsProperty("magic"); // 检查magic属性是否存在}}
3、处理自动装配的歧义性
当在Spring上下文中存在多个bean能够匹配所需的结果时,@autowired自动装配将产生歧义,Spring将抛出NoUniqueBeanDefinitionException异常。
解决办法:
- 标示首选的bean
@Component @Primarypublic class IceCrean implements Dessert {...}
<beanid="iceCream"class="..."primary="true" />
- 限定自动装配的bean——使用@Qualifier
(1)、使用@Qualifier("iceCream")限定bean的范围。@Qualifier注解所设置的参数就是想要注入的bean的ID;
(2)、使用自定义的限定符注解
@Component @Qualifier("cold")public class Poosicle implementsDessert {...}@Bean @Qualifier("cold")publicDessert iceCream() {return newIceCream(); }
4、bean的作用域
在默认情况下, Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。 也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。 Spring定义了多种作用域:
- 单例(Singleton):在整个应用中,只创建bean的一个实例(默认作用域)。
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
- 会话(Session):在Web应用中,为每个会话创建一个bean实例。
- 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。
4.1、使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE )设置bean的作用域;
4.2、使用<bean id="xxx" class="xxxx" scope="" />设置bean的作用域。
5、运行时值注入
运行时注入的两种方式:
- 属性占位符(Property placeholder);
- Spring表达式语言(SpEL)。
5.1、注入外部的值
(1)、通过Java配置类注入
@Configuration @PropertySource("classpath:com/zhux/ssm/app.properties") //声明属性源 public classExpressiveConfig {@AutowiredEnvironment env;@BeanpublicMagicBean magicBean() {return new MagicBean(env.getProperty("magic.title"), env.getProperty("magic.arttist")); //检索属性值 } }
(2)、通过XML注入
<context:property-placeholderlocation="classpath:db.properties"/> <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"> <propertyname="driverClassName"value="${jdbc.driver}" /> <propertyname="url"value="${jdbc.url}" /> <propertyname="username"value="${jdbc.username}" /> <propertyname="password"value="${jdbc.password}" /> </bean>
(3)、使用@Value注解——如果我们依赖于组件扫描和自动装配来创建和初始化应用组件的话,那么就没有指定占位符的配置文件或类了 。此时我们可以使用@Value注解。为了使用占位符,我们必须要配置一个PropertyPlaceholderConfigurer bean或PropertySourcesPlaceholderConfigurer bean。
public class MagicBean { public MagicBean(@Value("${magic.title}") title, @Value("${magic.artist}") artist) {... }}
// Java配置类中@Beanpublic static PropertySourcesPlaceholderConfigurer placeholderConfigurer { return new PropertySourcesPlaceholderConfigurer();}
5.2、使用Spring表达式语言进行装配——SpEL
转载于:https://www.cnblogs.com/zhuxiong/p/7653506.html
Spring笔记——Spring高级配置相关推荐
- Spring笔记③--spring的命名空间
p:命名空间: xmlns:p="http://www.springframework.org/schema/p" 作用:简化在xml配置bean的属性 在<bean> ...
- Spring笔记9--Spring的三大重要配置(alias,bean,import)
我的所有spring笔记大集锦 Spring5入门知识整合(持续更新) 目前而言就bean用的最多,import在以后的团队协作中用的很多 下面逐一说说各自用法 1.alias关键字 首先alias是 ...
- 2、Spring Boot尚硅谷笔记整理高级篇-消息
1.Spring Boot尚硅谷笔记整理高级篇-缓存 2.Spring Boot尚硅谷笔记整理高级篇-消息 3.Spring Boot尚硅谷笔记整理高级篇-检索 4.Spring Boot尚硅谷笔记整 ...
- Spring Bootstrap中具有配置元数据的高级配置
在简要介绍了配置元数据并涵盖了我之前的文章< 在Spring Boot中使用配置元数据Pimp您的配置>中的基础知识之后,现在该看看如何进一步执行此步骤并进一步自定义配置. 在这篇文章中, ...
- Spring Bootstrap中带有配置元数据的高级配置
在简要介绍了配置元数据并涵盖了我之前的文章< 在Spring Boot中使用配置元数据Pimp您的配置>中的基础知识之后,是时候看看如何进一步执行此步骤并进一步自定义配置了. 在本文中,我 ...
- (转) Spring读书笔记-----Spring的Bean之配置依赖
前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念 ),现在介绍Spring Bean的基本配置. 从开始我们知道Ja ...
- spring源码深度解析 第2版 pdf_吹爆!阿里爆款Spring源码高级笔记,原来看懂源码如此简单...
Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...
- 吹爆!阿里新产Spring源码高级笔记,原来看懂源码如此简单
Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...
- ASP.NET MVC 1.0 + spring.net 1.2.0.20288 + NHibernate 2.0.1.4000整合笔记(三)——NHibernate配置...
1.在CMS.App新增XML配置文件web_nhibernate.xml并设置为"嵌入的资源" 2.在Web.config中<spring> -> <re ...
最新文章
- matlab cat
- 用Python解“支票问题”题
- 电视机当计算机屏幕,怎么实现电视机当电脑的显示器和音箱用?
- ssh整合webservice cxf采用注解的方式+andriod客户端
- 【杂谈】有三AI知识星球一周年了!为什么公众号+星球才是完整的?
- java修车_JAVA小练习34——使用java描述一个车类与一个修车厂类
- PHP5魔术函数与魔术常量
- 在webclient UI page里嵌入external view
- Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。
- P1991-无线通讯网【最小生成树,瓶颈生成树】
- 单调栈 leetcode整理(二)
- 中国式离婚中,林与宋离婚成为定局的时刻
- linux获取连续数组下标值,shell 数组,双层循环打印变量
- 文章页网址有.html,Phpcms V9文章内容页自定义HTML网址技巧
- 抖音去水印最新php方法代码
- (转)Astar寻路教程
- 思科ASA防火墙端口映射
- 致移动开发的后10年
- Apple苹果终端如何进行批量管理?
- 根据ppt模板修改ppt内容
热门文章
- 关于蒸汽流量测量的讨论
- 忆阻器的matlab建模_【基于忆阻器的基本滤波电路的Pspice仿真研究】 忆阻器matlab仿真仿什么呢...
- 网络舆情事件发展趋势变化监测分析的方法
- 一款集合了对战、策略、养成与一体的魔幻战术对战策略手游——第八秩序
- 某查查app sign算法研究(二)
- 5.8晚间黄金行情走势分析及短线交易策略
- Thinking in java 琐碎知识点之 I/O流 、对象序列化
- Python学习日记:使用while循环打印九九乘法表和直角三角形
- 免费资源快来看 蓝桥杯单片机组历届省赛国赛题目解答(省一国二)
- 树莓派4B——操作系统的安装