Spring Bean配置方法
方法 | 基于XML配置 | 基于Annotation配置 | 基于Java类配置 |
---|---|---|---|
Bean定义 | <bean class="..."> | @Component和衍生注解@Repository,@Service,@Controller | 在注解了@Configuration的java类中,对方法名注解@Bean,方法返回该类型的实例 |
Bean名称 | id或name | @Component("name") | @Bean("name") |
Bean注入 | property | @Autowired | @Autowired |
Bean生命过程方法 | init-method和destroy-method | @PostContruct和@PreDestroy | @Bean的initMethod和destroyMethod |
Bean作用范围 | scrope属性 | @Scope("...") | @Scope("...") |
Bean延迟加载 | lazy-init属性 | @Lazy(true) | @Lazy(true) |
1. <context:annotation-config>
和<context:component-scan>
区别:
<context:annotation-config>
用于激活已经在Spring容器中注册过的Bean,而<context:component-scan>
除了有激活功能外,还可以在制定package下扫描注册Bean
2. scope
作用域 | 定义 |
---|---|
singleton | 默认参数,一个Spring容器中,一个Bean定义只有一个对象实例 |
prototype | 允许Bean的定义可以被实例化任意次 |
request | 一次HTTP请求中,每个Bean定义对应一个实例,仅限于Spring MVC |
session | 一个HTTP Session中,每个Bean定义对应一个实例,仅限于Spring MVC |
global-session | 全局HTTP Session中,对应一个实例,用于Portlet上下文 |
3. @Component
@Repository用于装饰DAO类,可以将将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型
@Service 通常作用在业务层
@Constroller 通常作用在控制层
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring 受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。
当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean 名称。默认情况下,对于包含 name 属性的 @Component、@Repository、 @Service 和 @Controller,会把 name 取值作为 Bean 的名字。如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的非限定类名。
4. Autowiring
byName
byType
constructor
autodetect
autowire-candidate & primary
4. @Autowired & @Inject & @Resource
@Autowired默认按类型,可以修饰方法、构造器、属性,用required=false(判断给定 Bean 的相应 Setter 方法是否都在实例化的时候被调用了,而不是判断字段是否已经存在值了。)和@Qualifier(“…”)
@Inject可以修饰方法、构造器、属性,没有required=false(不存在抛出异常),@Named(“…”)
@Resource(name=”…”),属于J2EE
7. factory-method & factory-bean
实现静态工厂,method必须为public static 方法
实现工厂实例,指定factory-method和factory-bean
实现FactoryBean接口
Spring例子
Spring官方文档
NetBeans wiki例子
SpringMVC NetBeans
碰到问题:
- log4j的版本1和2对应web.xml配置不一样,log4j1对应的是:
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
而log4j2对应的是:
<filter>
<filter-name>log4jServletFilter</filter-name>
org.apache.logging.log4j.web.Log4jServletFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>log4jServletFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
web.xml schema 版本问题
validation问题,还没搞清楚jsf的validation和hibernate-validator的关系,但@NotNull和@NotEmpty是有区别的,而http下取得的空值参数只能用@NotEmpty解决
oracle文档有对jsf的validation问题描述,链接