---------------------------------------------------------------------------------------
After ApplicationContext standard initialization.
All regular bean definitions will have been loaded, but no beans will have been instantiated yet.
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry for BeanDefinitionRegistry
BeanDefinitionRegistryPostProcessor.postProcessBeanFactory for Bean instance Registry
BeanDefinitionRegistryPostProcessor bean's @PostConstruct maybe ignored.
---------------------------------------------------------------------------------------
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));
BeanFactory bf=(BeanFactory)reg;
-----------------------------------------------------------------------------------------
BeanDefinitionBuilder beanDefBuilder = BeanDefinitionBuilder.genericBeanDefinition(your class);
add/set......
ApplicationContext getAutowireCapableBeanFactory -->(DefaultListableBeanFactory) --> beanFactory
ClassPathXmlApplicationContext is not instanceof DefaultListableBeanFactory
beanFactory.registerBeanDefinition ......
ApplicationContext.getAutowireCapableBeanFactory().applyBeanPostProcessorsAfterInitialization
beanFactory.registerSingleton(obj......);
-----------------------------------------------------------------------------------------
Resource resource = new ClassPathResource("appcontext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
new ClassPathXmlApplicationContext("classpath*:conf/**/*application-context.xml");
new ClassPathXmlApplicationContext("conf/**/*application-context.xml");
new FileSystemXmlApplicationContext("classpath:appcontext.xml");
new FileSystemXmlApplicationContext("file:G:/Test/src/appcontext.xml");
http://repo.spring.io
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!--classpath,file -->
<value>classpath:/.../*.properties</value>
<value>file:/.../*.properties</value>
</list>
</property>
</bean>
加载多个配置文件:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/applicationContext*.xml,classpath:config/applicationContext-web*.xml</param-value>
</context-param>
<import resource="resources/messageSource.xml"l>
<import resource="resources/applicationContext_*.xml" />
<import resource="lib/validator-rest-1.0.jar*/cms-validator-hibernate.xml"/>
<import resource="classpath*:config/applicationContext-*.xml" /> #ok,in jar
<mvc:annotation-driven /> 2 beans
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
context:annotation-config 4 beans
context:component-scan
applicationContext.xml in Tomcat load order: ServletContextListener.contextInitialized filter.init servlet.init
e.g:
main applicationContext.xml
<context:component-scan base-package="com.*">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
servlet-context.xml for MVC Servlet.
<mvc:annotation-driven />
<context:component-scan base-package="com.*" use-default-filters="false">#for include-filter
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
#ref-->#http://angelbill3.iteye.com/blog/1896502
Spring Annotation Resource Scanning:
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
<context:component-scan name-generator scope-resolver
当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean 名称。
默认情况下,对于包含 name 属性的 @Component、@Repository、 @Service 和 @Controller,会把 name 取值作为 Bean 的名字。
如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的非限定类名。
如果你不想使用默认 bean 命名策略,可以提供一个自定义的命名策略。首先实现 BeanNameGenerator 接口,确认包含了一个默认的无参数构造方法。然后在配置扫描器时提供一个全限定类名,
如下所示:
<context:component-scan base-package="a.b" name-generator="a.SimpleNameGenerator"/>
与通过 XML 配置的 Spring Bean 一样,通过上述注解标识的 Bean,其默认作用域是"singleton",为了配合这四个注解,
在标注 Bean 的同时能够指定 Bean 的作用域,Spring 2.5 引入了 @Scope 注解。使用该注解时只需提供作用域的名称就行了,如下所示:
@Scope("prototype")
如果你想提供一个自定义的作用域解析策略而不使用基于注解的方法,只需实现 ScopeMetadataResolver 接口,
确认包含一个默认的没有参数的构造方法。然后在配置扫描器时提供全限定类名:
<context:component-scan base-package="a.b" scope-resolver="footmark.SimpleScopeResolver" />
import org.springframework.core.type.filter.TypeFilter;
<context:component-scan base-package="com.XX">
<context:exclude-filter type="custom" expression="com.XX.core.spring.BeanComponentScanExcludeFilter"/>
</context:component-scan>
在一个context里可以有多个context:component-scan,针对不同的base-package进行扫描控制,
在一个context:component-scan里也可以存在多个exclude/include filters,当使用include-filter时,需use-default-filters="false",否则可能只有部分进行match,比如只匹配不带注解的类。
http://sishuok.com/forum/blogPost/list/2458.html
使用路径通配符加载Resource
Ant路径通配符支持“?”、“*”、“**”,注意通配符匹配不包括目录分隔符“/”:
“?”:匹配一个字符,如“config?.xml”将匹配“config1.xml”;
“*”:匹配零个或多个字符串,如“cn/*/config.xml”将匹配“cn/javass/config.xml”,但不匹配匹配“cn/config.xml”;而“cn/config-*.xml”将匹配“cn/config-dao.xml”;
“**”:匹配路径中的零个或多个目录,如“cn/**/config.xml”将匹配“cn /config.xml”,也匹配“cn/javass/spring/config.xml”;而“cn/javass/config-**.xml”将匹配“cn/javass/config-dao.xml”,即把“**”当做两个“*”处理。
Spring提供AntPathMatcher来进行Ant风格的路径匹配。具体测试请参考cn.javass.spring.chapter4. AntPathMatcherTest。
Spring在加载类路径资源时除了提供前缀“classpath:”的来支持加载一个Resource,还提供一个前缀“classpath*:”来支持加载所有匹配的类路径Resource。
Spring配置中classpath:和classpath*:的区别:
ClassLoader Class Path目录:
一般分为jar中的!/和非jar的first-class目录,典型的WEB-INF/classes or lib/jars目录,当然first-class目录可能有多个,优先加载顺序由加入classLoader时的url顺序决定,jars默认顺序为文件名顺序。
特例:
locationPattern->rootDirPath+subPattern
e.g: classpath:com/sub1/**/*/applicationContext*.xml
rootDirPath->classpath:com/sub1/ 又如classpath*:com/sub1/
subPattern->**/*/applicationContext*.xml
Enumeration<URL> resourceUrls = classLoader.getResources([rootDirPath-[classpath: / *:]]->"");[rootDirPath-[classpath: / *:]]长度为零, 如果subPattern.isPattern(*/?)只会在first-class目录查找,(classpath:或者classpath*:)都不会搜索jar中的!/目录, 这源于JDK的ClassLoader.getResources()方法中的一个限制,该方法只返回传入空字符串的文件系统位置(指示要搜索的潜在根)。
如果非模式匹配[由classLoader直接getResource(classpath:)/getResources(classpath*:)],如果在first-class目录找不到则会搜索jar中的!/目录。
[rootDirPath-[classpath: / *:]]长度为零:
1.subPattern不带模式匹配,classpath:或不加-->首先搜索first-class目录,除非找不到才会进入jar!/中搜索。classpath*:-->会搜索所有cp目录。
2.subPattern带有模式匹配,classpath:或不加-->搜索first-class目录的[rootDirPath-[classpath: / *:]]目录,匹配成功则返回,如果失败,不会进入jar!/中搜索。classpath*:-->同classpath:或不加,不会进入jar!/中搜索。因为classLoader.getResources("")的限制。
[rootDirPath-[classpath: / *:]]长度不为零:
1.subPattern不带模式匹配,classpath:或不加-->首先搜索first-class目录,除非找不到才会进入jar!/中搜索。classpath*:-->会搜索所有cp目录。
2.subPattern带有模式匹配,classpath:或不加-->搜索first-class目录的[rootDirPath-[classpath: / *:]]目录,匹配成功则返回。如果失败,只有当所有first-class目录中不存在[rootDirPath-[classpath: / *:]]才会进入jar!/中搜索。classpath*:-->会搜索所有cp目录。
classpath:是有可能搜索jar中!/目录的!
classpath:优先的单个(不管是否带有通配符), classpath*:多个(即便是不带有通配符)
PathMatchingResourcePatternResolver.getResource 优先的单个
PathMatchingResourcePatternResolver.getResources 多个
spring-framework-reference:
Please note that " classpath*:" when combined with Ant-style patterns will only work reliably with at
least one root directory before the pattern starts, unless the actual target files reside in the file system.
This means that a pattern like " classpath*:*.xml" will not retrieve files from the root of jar files
but rather only from the root of expanded directories. This originates from a limitation in the JDK’s
ClassLoader.getResources() method which only returns file system locations for a passed-in
empty string (indicating potential roots to search).
<context:property-placeholder location="classpath*:conf/conf*.properties"/>
<import resource="a.xml"/>
<import resource="b.xml"/>
mybatis-config.xml
<properties resource="db.properties"/>
<bean id="bizSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath*:com/XX/**/*.${bizDBTypeName}.mapper.xml" /> #如果在jar中则找不到!
<!--property name="mapperLocations" value="classpath*:com/XX/**/dao/impl/mapper/*.${bizDBTypeName}.mapper.xml" /-->
<property name="dataSource" ref="bizDataSource" />
</bean>
多事务管理,声明式事务:
<tx:annotation-driven/>
<bean id="bizTxManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="bizDataSource" />
<qualifier value="bizTxManager"/>
</bean>
<bean id="sysTxManager" class="your TM implements PlatformTransactionManager">
<qualifier value="sysTxManager"/>
</bean>
@Transactional(value="sysTxManager"[--->qualifier not beanId],rollbackFor={Throwable.class/*else just for RuntimeException/Error*/})
Bean Validator:
在mvc的servlet-context.xml中
<mvc:annotation-driven validator="yourValidator" />
<context:component-scan base-package="com.**.web" />#<-------会影响bean validator的扫描。
<bean id="yourValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<property name="validationMessageSource" ref="yourResourceBundleMessageSource"/>
</bean>
bean validation constraints的message在国际化环境中填写相应的code/id. "{messageCode}"
e.g:
List<FieldError> errors = binding.getFieldErrors();
String defaultMsg=ResourceMessageManager.getMessage(error.getDefaultMessage());
手动编程校验:
Set<ConstraintViolation<Object>> cs = yourValidator/LocalValidatorFactoryBean.getValidator().validate(targetObject, groups);
for cs todo ......
Spring mvc 3.2.x ----org.hibernate::hibernate-validator 4.3.x
@ControllerAdvice @ExceptionHandler(Exception.class) except @ResponseStatus Exceptions.
注意:一个@Valid后紧跟一个BindingResult(需要特殊处理时才跟BindingResult),在action中显式try-catch是捕获不到验证异常的,@Validated能进行分组验证而@Valid不能。
如果需要对参数对象的多个字段进行特殊逻辑验证,需要自定义Constraint,
@Constraint(validatedBy = DTOMultiFieldsValidator.class)
public @interface DTOMultiFieldsValid {
String message() default "{constraints.DTOMultiFieldsValid}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class DTOMultiFieldsValidator implements ConstraintValidator<DTOMultiFieldsValid, YourDTO> {
@Override
public boolean isValid(YourDTO dto, ConstraintValidatorContext context) {
对bean class @Lazy(value=true)
Set the default-lazy-init attribute at the <beans> root element level.
<beans ... default-lazy-init="true" >
相关推荐
### Spring Framework 3 教程知识点详述 #### 第一章:Spring框架概述 - **使用Spring框架的好处:** - **松耦合**:通过依赖注入(DI),Spring允许对象间保持松散耦合,这有助于提高代码的可重用性和可测试性。 ...
本文将详细探讨“Miscellaneous Connectors”(杂项连接器)和“Miscellaneous Devices”(杂项设备)这两个元件库,以及它们在Altium Designer中的应用。 首先,"Miscellaneous Connectors"元件库主要包含了各种...
Miscellaneous Device库文件是Altium Designer软件中一个重要的组成部分,主要包含了各种非标准或特定功能的电子元件模型。这些模型可以是物理设备、接口模块或者是系统级的抽象组件,为设计者提供了广泛的元器件...
"Miscellaneous Connectors元件库"是Altium Designer中一个重要的组成部分,它包含了各种不同类型的连接器模型,这些连接器在电路设计中起着至关重要的作用。Altium Designer是一款广泛使用的专业级PCB(印制电路板...
本文将深入探讨"Miscellaneous Devices.zip"这个压缩包文件,它包含了Altium Designer的自定义元件库,对于电路设计工作至关重要。 首先,"Miscellaneous Devices"一词暗示了这个元件库包含的是各种各样的通用元...
Miscellaneous Connectors库文件是专为Altium Designer设计软件准备的一个重要资源集合,它包含了各种不同类型的连接器模型,以供电子工程师在设计电路板时使用。这些连接器模型覆盖了广泛的用途,从简单的信号传输...
Miscellaneous Connectors集成库文件是Altium Designer软件中不可或缺的一部分,它为电子设计工程师提供了丰富的连接器模型资源。Altium Designer是一款广泛使用的电子设计自动化(EDA)软件,它集电路板设计、信号...
"Miscellaneous Devices LC.rar" 是一个压缩包文件,其中包含了与"AD库"相关的资源。AD库通常指的是模拟数字(Analog-Digital)库,它可能包含一系列与模拟信号处理、数字信号转换以及与ADLib相关的编程接口或驱动...
《立创自制AD元件库——Miscellaneous Devices LC.IntLib详解》 在电子设计领域,电路设计软件Altium Designer(简称AD)是广泛使用的工具之一,它提供了强大的电路板设计、仿真以及PCB布局功能。而元件库是AD的...
内包含贴片/直插型电阻电容、电解电容、电感及各类拨码开关、拨动开关、按键等PCB。包含常用芯片封装SOP、SOIC等。
### DXP2004下Miscellaneous Devices.Intlib元件库中常用元件详解 #### 一、电阻系列(res*)及排组(respack*) 电阻是电子电路中最基本的元件之一,用于限制电流和电压分配。在Miscellaneous Devices.Intlib元件...
Miscellaneous Connectors.PcbLib
protel99se的元件库的基本元件库,你所需要的一般都有的
7. **Miscellaneous**: - `spring-context-support.jar`: 提供了对常见第三方库的支持,如Quartz定时任务、JMS消息服务等。 这些jar包的集合构成了Spring框架的基础,它们协同工作,为开发者提供了一个强大且灵活...
DXP库文件,省去制作库和绘图的麻烦,内含大量实用原件,官网上没有
Miscellaneous Connector PCB.PcbLib
其他(Miscellaneous)部分则包含了一些杂项内容,例如如何合并持久化单元、类路径扫描@Entity类和JPA映射文件,以及CDI集成等。 整体而言,Spring Data JPA的官方参考文档是一个非常全面的技术指南,它不仅详细...
protel的元器件库文件,经常容易被误删,或者下载的软件里面没有,注意使用