spring装配bean的方式总结
个人总结:
spring装配bean的方式:创建应用对象之间协作关系的行为称为装配,这也是ID的本质。
1、在xml中进行显示配置:
声明:通过xml文件根节点<beans></beans>配置<bean>声明。然后
注入:以构造器注入方式配置或者setter属性方式注入。
2、在java中进行显示配置:要通过@Configration与@Bean搭配完成
通过@Configuration注解的类将被作为配置类使用,表示在该类中将定义Bean配置元数据,且使用@Configuration注解的类本身也是一个Bean,(相当于<beans>)
使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象(相当于<bean>),@Bean的注入方式有构造器方式和setter方式,即:@Bean使用的位置。
3、隐式的Bean发现机制和自动装配:分两步(1)组件扫描 (2)自动装配
(1) 组件扫描:spring 会自动发现应用上下文中所创建的Bean
创建可被扫描的Bean:使用@Component注解标记类.
启动组件扫描:也有两种方式:1、javaconfig配置;2、xml配置
1、javaconfig配置:@Componentscan @Configration
2、xml配置:xml中<context:component-scan base-package="xxx"/>
(2) 自动装配:spring 自动满足bean之间的依赖,通过@Autowired依赖注入
下面内容为在网上看到的文章:
- 基于XML的配置方式
- 基于注解的配置方式
- 基于Java类的配置方式
- @Component("userDao")
- public class userDao{......}
- <bean id="userDao" class="cn.lovepi.***.userDao"/>
- <context:component-scan base-package="cn.lovepi.spring" resource-pattern="anno/*.class"/>
- <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>
- Bean的定义注解
- Bean的生命周期注解
- Bean的依赖检查注解
- Bean的自动装配注解
- @Repository
- public class UserDaoImpl implements UserDao{......}
- <beans ...>
- <context:component-scan base-package="cn.lovepi.dao"/>
- ......
- <beans/>
- @Component:一个泛化的概念,表示一个组件(Bean),可作用在任何层次
- @Controller:用于对Controller实现类进行标注,目前该功能与Component相同
- @Repository:用于对DAO实现类进行标注
- @Service:用于对Service实现类进行标注,目前该功能与Component相同
- 实现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>
- @PostConstruct:初始化之后的执行的回调方法
- @PreDestroy:销毁之前的回调方法
- public class PersonService{
- @PostConstruct
- public void init(){......}
- @PreDestory
- public void destory(){......}
- }
- <context:annotation-config/>
- none: 默认不执行依赖检查
- simple :对原始基本类型和集合类型进行检查
- objects :对复杂类型进行检查
- all :对所有类型进行检查
- <context:annotation-config/>
- @Service
- public class LoginService{
- @Autowired
- private LogDao logDao;
- }
- public class LoginService{
- @Autowired(required=false)
- private LogDao LogDao;
- }
- public class LoginService{
- @Autowired
- @Qualifier("userDao")
- private UserDao userDao;
- }
- public class loginService{
- @Autowired(required=false)
- public List<Plugin> pligins;
- public List<Plugin> getPlugins(){
- return plugins;
- }
- }
- 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据
- 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
- AnnotationConfigApplicationContext或子类进行加载基于java类的配置
- @Configuration
- public class ApplicationContextConfig {
- @Bean
- public String message() {
- return "hello";
- }
- }<strong>
- </strong>
- public class ConfigurationTest {
- public static void main(String[] args) {
- AnnotationConfigApplicationContext ctx =
- new AnnotationConfigApplicationContext(ApplicationContextConfig.class);
- System.out.println(ctx.getBean("message"));
- }
- }
- @Configuration("ctxConfig")
- public class ApplicationContextConfig {
- ……
- }
- @Bean(name={},
- autowire=Autowire.NO,
- initMethod="",
- destroyMethod="")
- @Bean
- public String message() {
- return new String("hello");
- }
- <bean id="message" class="java.lang.String">
- <constructor-arg index="0" value="hello"/>
- </bean>
- 在基于Java方式的配置类中引入基于XML方式的配置文件
- 在基于XML方式的配置文件中中引入基于Java方式的配置
- <bean id="message" class="java.lang.String">
- <constructor-arg index="0" value="test"></constructor-arg>
- </bean>
- @Configuration("ctxConfig")
- @ImportResource("classpath:com/jike/***/appCtx.xml")
- public class ApplicationContextConfig {
- ……
- }
- <context:annotation-config/>
- <bean id="ctxConfig" class=“com.jike.***..ApplicationContextConfig"/>
- //测试类
- public void testXmlConfig() {
- String configLocations[] = {" classpath:com/jike/***/appCtx.xml"};
- ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
- ……
- }
- ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
- ctx.register(DaoConfig.class);
- ctx.register(ServiceConfig.class);
- ctx.refresh();
- @Configuration
- @Import(DaoConfig.class)
- public class ServiceConfig {……}
基于XML的配置主要使用场景:
- 第三方类库,如DataSource、JdbcTemplate等;
- 命名空间,如aop、context等;
- Bean的实现类是当前项目开发的,可直接在Java类中使用注解配置
- 对于实例化Bean的逻辑比较复杂,则比较适合用基于Java类配置的方式