Spring学习(三)

Bean 管理的注解

从Spring3.0开始,Spring JavaConfig项目提供了很多特性,包括使用java而不是XML定义bean,比如@Configuration、@Bean、@Import、@DependsOn

  • @Component是一个通用注解,可适用于任何bean
  • @Repository通常用于注解DAO类,即持久层
  • @Service通常用于注解Service类,即服务层
  • @Controller通常用于注解Controller类,即控制层(MVC)

元注解(Meta-annotations)

许多Spring提供的注解可以作为自己的代码,即”元数据注解“,元注解是简单的注解,可以应用到另一个注解。除了value()以外,还可以有其他的属性,允许定制。

类的自动检测及Bean的注册

Spring可以自动检测类并注册Bean到ApplicationContext中。有的注解是类的注解,有点注解是方法的注解。

为了能够检测类并注册相应的Bean,需要在xml文件中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
//配置如下(base-package扫描包下的类)
<context:component-scan base-package="com.test"></context:component-scan>
</beans>

包含了,通常在使用前者后,不再使用后者。

使用过滤器进行自定义扫描

1
2
3
4
5
6
7
8
<context:component-scan base-package="com.test">
//包含过滤器
<context:include-filter type="regex" expression=".*Stub.*Repository"/>
//排除过滤器
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
//type类型还有很多

定义Bean

扫描过程中组件被自动检测,Bean的名称是由BeanNameGenerator生成的。@Component、@Repository、@Service、@Controller都有一个name属性来显式设置Bean Name。

作用域

scope默认值是singleton,@Scope注解可设置Bean的作用域。

例子

Beans.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.test"></context:component-scan>
</beans>

BeanAnnotation.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.test;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Scope("prototype")
@Component
//@Component("bean")
public class BeanAnnotation {
public void say(String word){
System.out.println("BeanAnnotation:"+word);
}
}

MainApp.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainApp {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
BeanAnnotation beanAnnotation = (BeanAnnotation)context.getBean("beanAnnotation");
//自定义name属性
// BeanAnnotation beanAnnotation = (BeanAnnotation)context.getBean("bean");
beanAnnotation.say("hello world:"+beanAnnotation.hashCode());
//测试作用域
BeanAnnotation beanAnnotation2 = (BeanAnnotation)context.getBean("beanAnnotation");
beanAnnotation2.say("hello world:"+beanAnnotation2.hashCode());
}
}
您的支持将鼓励我继续创作~