Spring学习(二):3个装配bean方式

作者: 蓝汝丶琪 | 来源:发表于2017-06-26 11:49 被阅读96次

bean的生命周期

bean.jpg
  • Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载、实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用。

3个装配方式

  • 基于Java类的配置方式
  • 基于XML的配置方式
  • 基于注解的配置方式

1.基于Java类的配置方式

基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件。

1.1要点:

  • 必须要两个注解:
    • @Configuration :代替了xml配置.表明该类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
    • @Bean : 告诉Spring,这个方法将会返回一个对象。一般用在构造器和Setter方法上
  • 只需要这个两个注解,就可以完成bean的装配过程了。
  • 非必须的注解:
    • @import :用来引入别的类里面同样有@Configuration标签的类。
    • @importResource : 用来引入xml配置,实现xml配置方式和java类配置方式共存。

1.2例子

  • 代码结构
    • Configuration 包:用来放Java类的配置。其实其作用就是跟xml配置一样的。所以此包下的类是Java类配置方式的核心
    • Entity 包:用来放bean
    • test 包: 测试
  • 代码
    • Configuration 包下的EntityConfig类:
@Configuration //表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源
public class EntityConfig {

    @Bean
    public UserBean user(){
        return new UserBean( student());  //有参构造
    }

    @Bean
    public StudentBean student(){
        return new StudentBean();
    }
}
  • Entity 包 UserBean类和StudentBean类:
public class UserBean {
    private StudentBean studentBean;

    public UserBean(){}
    public UserBean(StudentBean studentBean){
        this.studentBean=studentBean;
    }

    @Override
    public String toString() {

        return "this is UserBean";
    }

    public StudentBean getStudent(){
        return studentBean;
    }
}
public class StudentBean {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "this is StudentBean";
    }
}
  • test 包
@Test
    public void test(){
       
        ApplicationContext ctx=
                new AnnotationConfigApplicationContext(EntityConfig.class);  //应用上下问
        UserBean userBean=ctx.getBean(UserBean.class);

        StudentBean student = userBean.getStudent(); //从userBean里,看是否获得studenBean
        System.out.println(student.toString());

    }

1.3基于Java类的配置主要使用场景:

对于实例化Bean的逻辑比较复杂,则比较适合用基于Java类配置的方式

2.基于XML配置

其实可从基于java类配置方式去考虑,在Java类配置方式中,需要的两个注解@Configuration 和@Bean 转化成xml配置文件里说明。这样的话java的配置类也可以不要了。

2.1要点

2.2 例子

  • Entity类:跟上面类一样,不需要该。
  • xml配置:
<?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-2.5.xsd">


    <bean id="studentBean" class="cn.Entity.StudentBean"/>  

    <bean id="userBean" class="cn.Entity.UserBean">
     //在userBean类里面注入StudentBean 类,如果没有这条会出现
       NullPointerException异常
    <property name="studentBean"  ref="studentBean"/>    
     // name="" 是userBean 的属性名称。(需要setter方法)
     // ref="" 是上面studentBean类注入的id。
     </bean>



</beans>
  • test类
@Test
    public void testUserBean(){
        ApplicationContext ctx=
                new ClassPathXmlApplicationContext("spring.xml"); //配置文件的绝对路径
        if (ctx!=null){
            UserBean user = (UserBean) ctx.getBean(UserBean.class);
            System.out.println(user.getStudent());
        }
    }
  • 使用场景:
    • 第三方类库,如DataSource、JdbcTemplate等;
    • 命名空间,如aop、context等;

3.自动化装配bean

可以对比前面两种方法的变化,可以知道配置方法上的不同了。

  • 相对于基于xml配置方法来说,不需要在xml里面配置注入bean的信息,而换成注解注入。
  • 而相对与基于java配置方法来说,不需要在配置类中创建对象的方法,只需要在需要注入的地方,用注解就可以了

3.1要点

  • 从两个角度来实现自动化装配:
    • 组件扫描:Spring会自动发现应用上下文中所创建的bean。(需要在xml里面配置,或者用注解)
    • 自动装配:Spring自动满足bean之间的依赖。(需要用注解)

3.2例子

  • 用@configuration来装配bean
    • 用到的注解
      • @Configuration :代替了xml配置.表明该类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
      • @ComponentScan:启动组件扫描。(如果没有设定范围,默认该包下)
      • @Autowired :自动注入。用在类下对象的注入
      • @Compoent : 表明该类会作为组件类,并告知Spring要为该类建立bean。
      • @RunWith(SpringJUnit4ClassRunner,class):在测试开始的时候自动创建Spring的应用上下文
    • @ContextConfiguration(class=xxxx) :加载配置,在这里是Config.class

很奇怪,如果不用@ContextConfiguration(class=xxxx) 这个加载配置,是扫描不到我测试类下面的@Autowired 注解。也就是我用正规创建上下文方法创建的话,test类下的对象是null的。 有待解决
- 代码结构
- Config类:用来装配Spring规则。具有@Configuration和@ComponentScan注解
- StudentBean类和UserBean
- test类
- 例子
- Config类

@Configuration
@ComponentScan(basePackages = {"cn.Entity"})
public class Config {  //不需像基于java配置一样,用方法返回new 对象。
}
  - SutdentBean和UserBean类 
@Component
public class StudentBean {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "this is StudentBean";
    }
}

***********************************************************************
@Component
public class UserBean {
    private StudentBean studentBean;


    public UserBean(){}

    @Autowired
    public UserBean(StudentBean studentBean){
        this.studentBean=studentBean;
    }

    @Override
    public String toString() {

        return "this is UserBean";
    }

    public StudentBean getStudent(){
        return studentBean;
    }



    public StudentBean getStudentBean() {
        return studentBean;
    }


}

  • test类
 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class UserBeanTest extends TestCase {

    @Autowired
    private UserBean userBean;

    @Test
    public void testUserBean(){

            System.out.println(userBean.getStudent());
             System.out.println(userBean);

    }
}
  • 用xml配置文件来装配bean
    只是把上面的Config类,用xml替换掉。其实只是用xml文档写一个扫描语句
    • spring.xml文档
            <?xml version="1.0" encoding="UTF-8"?>
            <beans //省去很多约束
      
            <context:component-scan base-package="cn.Entity"/>
      
            </beans>
      
      
    • StudentBean类和UserBean类没变
    • Test类
              @RunWith(SpringJUnit4ClassRunner.class)
               @ContextConfiguration({"/spring.xml"})  //加载xml配置
             public class UserBeanTest extends TestCase {
                @Autowired
               private UserBean userBean;
               @Test
                 public void testUserBean(){
                       System.out.println(userBean.getStudent());
                        System.out.println(userBean);
                 }       }
      
  • 使用场景:Bean的实现类是当前项目开发的,可直接在Java类中使用注解配置

4.总结

  • 3个配置方式其实都很简单,在开发过程中,都是推荐使用xml配置和自动化装配。
  • 不同配置方式比较
xml.png

相关文章

网友评论

    本文标题:Spring学习(二):3个装配bean方式

    本文链接:https://www.haomeiwen.com/subject/knhdcxtx.html