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.activespring.profiles.default。如果设置了spring.profiles.active属性的话,那么它的值就会用来确定哪个profile是激活的。但如果没有设置spring.profiles.active属性的话,那Spring将会查找spring.profiles.default的值。如果spring.profiles.activespring.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注解所设置的参数就是想要注入的beanID;

  (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 beanPropertySourcesPlaceholderConfigurer 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高级配置相关推荐

  1. Spring笔记③--spring的命名空间

    p:命名空间: xmlns:p="http://www.springframework.org/schema/p" 作用:简化在xml配置bean的属性 在<bean> ...

  2. Spring笔记9--Spring的三大重要配置(alias,bean,import)

    我的所有spring笔记大集锦 Spring5入门知识整合(持续更新) 目前而言就bean用的最多,import在以后的团队协作中用的很多 下面逐一说说各自用法 1.alias关键字 首先alias是 ...

  3. 2、Spring Boot尚硅谷笔记整理高级篇-消息

    1.Spring Boot尚硅谷笔记整理高级篇-缓存 2.Spring Boot尚硅谷笔记整理高级篇-消息 3.Spring Boot尚硅谷笔记整理高级篇-检索 4.Spring Boot尚硅谷笔记整 ...

  4. Spring Bootstrap中具有配置元数据的高级配置

    在简要介绍了配置元数据并涵盖了我之前的文章< 在Spring Boot中使用配置元数据Pimp您的配置>中的基础知识之后,现在该看看如何进一步执行此步骤并进一步自定义配置. 在这篇文章中, ...

  5. Spring Bootstrap中带有配置元数据的高级配置

    在简要介绍了配置元数据并涵盖了我之前的文章< 在Spring Boot中使用配置元数据Pimp您的配置>中的基础知识之后,是时候看看如何进一步执行此步骤并进一步自定义配置了. 在本文中,我 ...

  6. (转) Spring读书笔记-----Spring的Bean之配置依赖

    前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念 ),现在介绍Spring Bean的基本配置. 从开始我们知道Ja ...

  7. spring源码深度解析 第2版 pdf_吹爆!阿里爆款Spring源码高级笔记,原来看懂源码如此简单...

    Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...

  8. 吹爆!阿里新产Spring源码高级笔记,原来看懂源码如此简单

    Spring的影响力想必无需与大家多说,如果你用spring,那么读读源码有助于对你最重要的工具的理解,好的框架源码也可以帮助我们理解什么是好代码. 刚参加工作那会,没想过去读源码,更没想过去改框架的 ...

  9. 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 ...

最新文章

  1. matlab cat
  2. 用Python解“支票问题”题
  3. 电视机当计算机屏幕,怎么实现电视机当电脑的显示器和音箱用?
  4. ssh整合webservice cxf采用注解的方式+andriod客户端
  5. 【杂谈】有三AI知识星球一周年了!为什么公众号+星球才是完整的?
  6. java修车_JAVA小练习34——使用java描述一个车类与一个修车厂类
  7. PHP5魔术函数与魔术常量
  8. 在webclient UI page里嵌入external view
  9. Maven编译项目时报错:不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。
  10. P1991-无线通讯网【最小生成树,瓶颈生成树】
  11. 单调栈 leetcode整理(二)
  12. 中国式离婚中,林与宋离婚成为定局的时刻
  13. linux获取连续数组下标值,shell 数组,双层循环打印变量
  14. 文章页网址有.html,Phpcms V9文章内容页自定义HTML网址技巧
  15. 抖音去水印最新php方法代码
  16. (转)Astar寻路教程
  17. 思科ASA防火墙端口映射
  18. 致移动开发的后10年
  19. Apple苹果终端如何进行批量管理?
  20. 根据ppt模板修改ppt内容

热门文章

  1. 关于蒸汽流量测量的讨论
  2. 忆阻器的matlab建模_【基于忆阻器的基本滤波电路的Pspice仿真研究】 忆阻器matlab仿真仿什么呢...
  3. 网络舆情事件发展趋势变化监测分析的方法
  4. 一款集合了对战、策略、养成与一体的魔幻战术对战策略手游——第八秩序
  5. 某查查app sign算法研究(二)
  6. 5.8晚间黄金行情走势分析及短线交易策略
  7. Thinking in java 琐碎知识点之 I/O流 、对象序列化
  8. Python学习日记:使用while循环打印九九乘法表和直角三角形
  9. 免费资源快来看 蓝桥杯单片机组历届省赛国赛题目解答(省一国二)
  10. 树莓派4B——操作系统的安装