首页投稿(暂停使用,暂停投稿)程序员

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

2017-06-26  本文已影响96人  蓝汝丶琪

bean的生命周期

bean.jpg

3个装配方式

1.基于Java类的配置方式

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

1.1要点:

  • 只需要这个两个注解,就可以完成bean的装配过程了。

1.2例子

@Configuration //表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源
public class EntityConfig {

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

    @Bean
    public StudentBean student(){
        return new 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
    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 例子

<?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
    public void testUserBean(){
        ApplicationContext ctx=
                new ClassPathXmlApplicationContext("spring.xml"); //配置文件的绝对路径
        if (ctx!=null){
            UserBean user = (UserBean) ctx.getBean(UserBean.class);
            System.out.println(user.getStudent());
        }
    }

3.自动化装配bean

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

3.1要点

3.2例子

很奇怪,如果不用@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;
    }


}

 @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);

    }
}

4.总结

xml.png
上一篇 下一篇

猜你喜欢

热点阅读