Spring中三种配置Bean的⽅式
Spring中三种配置Bean的⽅式分别是:
1. 基于XML的配置⽅式
2. 基于注解的配置⽅式
3. 基于Java类的配置⽅式
⼀.基于XML的配置
这个很简单,所以如何使⽤就略掉。
⼆.基于注解的配置
Spring2.0开始引⼊基于注解的配置⽅式,即Bean的定义信息可以通过在Bean的实现类上标注注解实现。
不清楚Java注解的参阅
@Component是Spring容器中的基本注解,表⽰容器中的⼀个组件(bean),可以作⽤在任何层次,下⾯的⽰例介绍该注解的使⽤⽅法。注解配置⽰例:
@Component("userDao")
public class userDao{......}
等效于XML配置
<bean id="userDao" class="cn.lovepi.***.userDao"/>
此外,还有⼀些其他的可以被⽤来注解bean的注解,这些可以让注解类本⾝的⽤途更加清晰,此外,特定的注解也具备特定的功能。Spring在2.5后提供了⼀个context的命名空间,它提供了通过扫描类包来加载利⽤注解定义的Bean的⽅式。
在context中可以使⽤resource-pattern来过滤出特定的类。
<context:component-scan base-package="cn.lovepi.spring" resource-pattern="anno/*.class"/>
默认情况下加载的是package下的*.class即扫描全部类,在使⽤了resource-pattern之后,则只扫描package下的anno⼦包下的所有类。
不过使⽤resource-pattern并不能提供给我们完善的功能,所以我们得使⽤过滤⼦元素的⽅法。
<context:component-scan base-package="cn.lovepi.spring">
<context:include-filter type="regex" expression="cn.lovepi.spring.*"/>
<context:exclude-filter type="aspectj" expression="cn.lovepi..*Controller+"/>
</context:component-scan>
其中:
include-filter表⽰要包含的⽬标类,
exclude-filter表⽰要排除在外的⽬标类
⼀个component-scan标签下可以有多个include-filter和exclude-filter,
过滤表达式所⽀持的类型如下表所⽰:
在这些类型当中,除了Custom外,aspectj的过滤功能最强⼤,他能轻易的实现其他类别的过滤规则。
Spring3.0提供了⼀系列的针对依赖注⼊的注解,这使得Spring IoC在XML⽂件之外多了⼀种可⾏的选择,主要包含如下注解类型:Bean的定义注解
Bean的⽣命周期注解
Bean的依赖检查注解
Bean的⾃动装配注解
1.Bean的定义注解
Spring⾃2.0开始,陆续引⼊了⼀些注解⽤于简化Spring的开发。
@Repository注解便属于最先引⼊的⼀批,⽤于将数据访问层(DAO层)的类标识为Spring Bean。具体使⽤如下:
①⾸先使⽤@Repository将DAO类声明为Bean
@Repository
public class UserDaoImpl implements UserDao{......}
②在XML配置⽂件中启动Spring的⾃动扫描功能
<beans ...>
<context:component-scan base-package="cn.lovepi.dao"/>
......
<beans/>
如此的话,我们便不在需要在XML当中显式使⽤bean来进⾏bean的配置。Spring容器在初始化的时候便会⾃动扫描base-package所指定的包以及⼦包下⾯的所有class⽂件。所有标注为Repository的类将被⾃动注册为bean。
为什么Repository只能标注在DAO类上⾯呢?
因为该注解的作⽤不只是将类识别为bean,同时他还能将所标注的类中所抛出的数据访问异常封装为Spring的数据访问异常类型。Spring本⾝提供了⼀个丰富的,并且是与具体的访问技术⽆关的数据访问异常结构,⽤于封装不同的持久层框架所抛出的异常,使得异常独⽴与底层的框架。
Spring2.5在@Repository的基础上增加了功能类似的额外三个注解,总共有如下四种注解:
@Component:⼀个泛化的概念,表⽰⼀个组件(Bean),可作⽤在任何层次
@Controller:⽤于对Controller实现类进⾏标注,⽬前该功能与Component相同
@Repository:⽤于对DAO实现类进⾏标注
@Service:⽤于对Service实现类进⾏标注,⽬前该功能与Component相同
这三个注解除了作⽤于不同软件层次的类,其使⽤⽅式与Repository是完全相同的。
2.Bean的⽣命周期注解
在某些情况下,可能需要我们⼿⼯做⼀些额外的初始化或者销毁操作,例如资源的获取和是否操作,Spring1.x为此提供了两种⽅式供⽤户指定执⾏⽣命周期回调的⽅法:
实现Spring提供的两个接⼝:initializingBean 和 DisposableBean,这种⽅法是要求bean类实现Spring的接⼝,但增加了bean和Spring容器的耦合度,因此不推荐使⽤。
在XML⽂件中使⽤<bean>的init-method 和 destory-method 属性,指定初始化之后和回调之前的回调⽅法。这两个属性的取值是bean中相应的初始化和销毁⽅法的名称。⽅法名称任意,但是⽅法不能有参数。
⽰例如下:
<bean id="userService" class="cn.lovepi.***.UserService"
init-method="init" destory-method="destory">
</bean>
在这⾥,我们指定了userService 这个bean的初始化⽅法为:init    销毁⽅法为:destory
Spring2.5在保留以上两种⽅式的基础上,提供了对JSR-250的⽀持。
JSR-250规范定义了两个⽤于指定声明周期⽅法的注解:
@PostConstruct:初始化之后的执⾏的回调⽅法
@PreDestroy:销毁之前的回调⽅法
注解⽰例说明:
public class PersonService{
@PostConstruct
public void init(){......}
@PreDestory
public void destory(){......}
}
在这⾥init⽅法是初始化之后执⾏的⽅法,⽽destory⽅法为销毁之前执⾏的⽅法。
由于使⽤了注解,所以得激活Bean的后处理器,所以得在XML配置⽂件当中增加
<context:annotation-config/>
3.Bean的依赖检查注解
Spring2.0之前使⽤dependency-check在配置⽂件中设置属性⽤于依赖检查(只会检查Setter⽅法是否被调⽤),缺点是粒度较粗,该属性的取值包括以下⼏种:
none:默认不执⾏依赖检查
simple :对原始基本类型和集合类型进⾏检查
objects :对复杂类型进⾏检查
all :对所有类型进⾏检查
使⽤Spring2.0提供的@Required注解,提供了更细粒度的控制,@Required注解只能标注在Setter⽅法之上,(标注在其他⽅法之上会被忽略)⽤于检查其是否被调⽤,当Setter⽅法未被调⽤的话会抛出异常。
由于使⽤了注解,所以得激活Bean的后处理器,所以得在XML配置⽂件当中增加
<context:annotation-config/>
4.Bean的⾃动装配注解
@Autowired可以对成员变量、⽅法和构造函数进⾏标注,来完成⾃动装配的⼯作,他根据类型进⾏⾃动装配,如果需要按名称进⾏装配,则需要配合@Qualifier使⽤。
当标注了@Autowired的⽅法所需的类型在Spring容器中不存在的话会抛出异常
@Service
public class LoginService{
@Autowired
private LogDao logDao;
}
如上⾯的例⼦所⽰,假如Spring容器中没有LogDao这个bean的话便会抛出异常。
解决的办法便是使⽤required=false属性来标注
public class LoginService{
@Autowired(required=false)
private LogDao LogDao;
}
但是假如Spring当中存在多个所需类型的bean,那么便要使⽤@Qualifier注解来指定名称。
public class LoginService{
@Autowired
实例化bean的三种方式@Qualifier("userDao")
private UserDao userDao;
}
@Autowired 可以对类中集合类的变量或⽅法⼊参进⾏标注,此时会将容器中类型匹配的所有Bean都注⼊进来,如下所⽰:
public class loginService{
@Autowired(required=false)
public List<Plugin> pligins;
public List<Plugin> getPlugins(){
return plugins;
}
}
Spring会将容器中所有类型为Plugin的bean都注⼊到集合中去。
三.基于Java类的配置
基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置⽂件。
⾸先让我们看⼀下基于Java类如何定义Bean配置元数据,具体步骤如下:
使⽤@Configuration注解需要作为配置的类,表⽰该类将定义Bean的元数据
使⽤@Bean注解相应的⽅法,该⽅法名默认就是Bean的名称,该⽅法返回值就是Bean的对象。
AnnotationConfigApplicationContext或⼦类进⾏加载基于java类的配置。
接下来通过⽰例来演⽰下如何基于Java类来配置Spring
⾸先创建⼀个配置类
@Configuration
public class ApplicationContextConfig {
@Bean
public String message() {
return "hello";
}
}
然后还需要⼀个测试类,来查看配置是否成功
public class ConfigurationTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
System.out.Bean("message"));
}
}
通过@Configuration注解的类将被作为配置类使⽤,表⽰在该类中将定义Bean配置元数据,且使⽤@Configuration注解的类本⾝也是⼀个Bean,使⽤⽅式如下所⽰:
@Configuration("ctxConfig")
public class ApplicationContextConfig {
……
}
其中Configuration中的参数值即为该bean的名称。
通过@Bean注解配置类中的相应⽅法,则该⽅法名默认就是Bean名,该⽅法返回值就是Bean对象,并定义了Spring IoC容器如何实例化、⾃动装配、初始化Bean逻辑,具体使⽤⽅法如下:
@Bean(name={},
autowire=Autowire.NO,
initMethod="",
destroyMethod="")
其中name为bean的名称,可以有多个,autowire为是否⾃动装配,默认值为NO,initMethod为bean的初始化⽅法,destoryMethod为bean 的销毁⽅法。
bean的注解具体使⽤如下:
@Bean
public String message() {
return new String("hello");
}
如上的代码等价与XML配置:
<bean id="message" class="java.lang.String">
<constructor-arg index="0" value="hello"/>
</bean>
注意:使⽤bean注解的⽅法不能是private、final、static的。
基于Java⽅式的配置⽅式不是为了完全替代基于XML⽅式的配置,两者可以结合使⽤,因此可以有两种结合使⽤⽅式:
在基于Java⽅式的配置类中引⼊基于XML⽅式的配置⽂件
在基于XML⽅式的配置⽂件中中引⼊基于Java⽅式的配置
引⼊基于XML配置⽂件:
<bean id="message" class="java.lang.String">
<constructor-arg index="0" value="test"></constructor-arg>
</bean>
@Configuration("ctxConfig")
@ImportResource("classpath:com/jike/***/l")
public class ApplicationContextConfig {
……
}
可以看到在java程序中使⽤@ImportResource导⼊了XML的配置⽂件
引⼊基于Java的配置⽂件:
<context:annotation-config/>
<bean id="ctxConfig" class=“com.jike.***..ApplicationContextConfig"/>
//测试类
public void testXmlConfig() {
String configLocations[] = {" classpath:com/jike/***/l"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
……
}
可以看到在XML的配置⽂件当中将java的配置类当中Bean来声明,第⼀⾏的是开启注解驱动⽀持。
值得注意的是必须得配置<context:annotation-config/>在XML配置⽂件中。
Spring提供了⼀个AnnotationConfigApplicanContext类,能够直接通过标注@Configuration的Java类启动Spring容器:通过构造函数加载配置类:
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);
通过编码⽅式注册配置类:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
可以看到ctx注册了多个configuration类,然后通过refresh类来刷新容器以应⽤这些配置⽂件。
可以通过代码⼀个个的引⼊配置类,当然也可以使⽤@Import注解来引⼊配置类
引⼊多个配置类:
@Configuration
@Import(DaoConfig.class)
public class ServiceConfig {……}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。