Spring装配javaBean的三种方式
1.使用@Component注解的方式装配bean
1.1使用注解的方式创建一个Bean
@Component //这个地方还可以命名@Component("cDPlayer")
public class CDPlayer {
}
1.2你的配置类里面开启自动扫描
@Configuration
@ComponentScan("cm.bean")//这个地方的值就是表名了你会扫描那些包,其实跟xml里面的配置差不多
//@ComponentScan(basePackageClasses = MediaPlayer.class)//扫描MediaPlayer包下面的所有类
public class CDPlayerConfig {
}
1.3在装配的时候使用@Autowired装配即可
@Component
public class Test {
@Autowired
private CDPlayer cdPlayer;
}
这些是通过spring里面的注解@Component和@Autowired注解结合来装配bean其实也可以使用@Named和@Inject注解来创建和装配bean,区别不太大。我是习惯于使用spring原生态的注解。有兴趣的可以百度一下,很多帖子,我这里就不再赘述了。
2.通过java代码装配bean
2.1.1创建一个spring的配置类加入@Configuration注解声明成配置类
@Configuration
public class CDPlayerConfig {
}
2.1.2 创建一个javaBean
@Configuration
public class CDPlayerConfig {
//这里就创建了一个CDPlayer的bean 这个bean在spring容器里面的ID就是cDPlayer @Bean这个注解支持对Bean重命名,可以自定义Bean的名称
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer();
}
@Bean
public Test test(){
return new Test();
}
}
2.2.1 借住JavaConfig实现注入
利用构造器把CDPlay类注入到Test类里面Test类如下:
public class Test {
private CDPlayer cdPlayer;
public Test(CDPlayer cdPlayer) {
this.cdPlayer = cdPlayer;
}
}
配置类也通过方法调用注入:
@Configuration
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer();
}
@Bean
public Test test(){
return new Test(cdPlayer());
}
}
注意:看起来CDPlayer是通过调用cdPlayer()方法得到的,但情况并非完全如此,因为cdPlayer方法上添加了@Bean注解,Spring将会拦截所有对他的调用,并确保直接放回该方法所创建的Bean,而不是每次都对其进行实际的调用。如果像java调用方法那样调用一样的话,那么没有都会获取一个新的CDPlayer对象,但是Spring在默认的情况下bean是单利的,就违反了Spring默认的机制。如果你需要的就是每次都需要一个新的对象的话那么你可以通过配置去处理,详情可以去了解一下Bean的生命周期。Spring创建Bean的方式有好几种。例如单利,原型,request,session…等等。
2.2.2 通过另一种方式注入更方便
@Configuration
public class CDPlayerConfig {
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer();
}
@Bean
public Test test(CDPlayer cdPlayer){
return new Test(cdPlayer);
}
}
这个里的test()方法请求一个CDPLayer作为参数。当Spring调用test()方法创建Test bean的时候,它会自动装配一个CDPlayer到配置方法之中,然后犯法提就可以按照合适的方式来使用他。借助这个技术,不用调用方法也可以注入CDPlayer,并且不用明确引用哪一个CDPlayer,如果CDPlayer是一个接口的话那么这个地方就可引用不同的实现类了。通过这种方式引用其他的Bean通常是最佳的选择。
3.通过XML文件装配bean
3.1xml文件里面声明一个bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<!--创建一个bean 这里id表示了这个类在spring容器里的唯一id,bean标签有一个name属性,也可以指定name属性,但是name属性有可能会重名-->
<bean id="cdPlayer" class="cm.bean.pojo.CDPlayer"/>
</beans>
3.2 bean直接的注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<bean id="cdPlayer" class="cm.bean.pojo.CDPlayer"/>
<!--通过构造器注入值-->
<bean id="test" class="cm.bean.pojo.Test">
<constructor-arg ref="cdPlayer"/>
</bean>
</beans>
或者使用c命名空间来入职值:
<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<bean id="cdPlayer" class="cm.bean.pojo.CDPlayer"/>
<!--通过构造器注入值-->
<bean id="test" class="cm.bean.pojo.Test">
<constructor-arg ref="cdPlayer"/>
</bean>
<bean id="tests" class="cm.bean.pojo.Test" c:cdPlayer-ref="cdPlayer"/>
</beans>