首页 > 编程语言 > 详细

Spring学习笔记(三)

时间:2020-01-30 18:15:55      阅读:69      评论:0      收藏:0      [点我收藏+]

三种方法装配bean

1.自动化装配bean

1.1 bean之间没有依赖关系

配置类:

@Configuration      //表明这是一个配置类,配置Spring容器
@ComponentScan      //启动组件扫描,默认会扫描与配置类相同的包
public class LtConfig {
}

UserDaoImpl:

@Component          //表明该类会作为组件类,并告知Spring要为这个类创建bean
public class UserDaoImpl implements UserDao {
    public void getUser() {
        System.out.println("默认获取用户的数据");
    }
}

测试:

public class MyTest {       //测试类
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(com.lt.LtConfig.class);
        UserDao dao = (UserDao) context.getBean("userDaoImpl");
        dao.getUser();
    }
}

1.2 bean之间存在依赖

配置类不变

CarDaoImpl:

@Component
public class CarDaoImpl implements CarDao{
    @Override
    public void getCarName() {
        System.out.println("AE86");
    }
}

UserDaoImpl:

@Component
public class UserDaoImpl implements UserDao {

    private CarDao carDao;

    @Autowired
    public UserDaoImpl(CarDaoImpl carDao){
        this.carDao = carDao;
    }

    @Override
    public void getUser() {
        System.out.println("获得用户");
        carDao.getCarName();
    }
}

UserDaoImpl对CarDaoImpl产生了依赖,并通过构造器注入。在这里,使用@Autowired由Spring容器来自动装配。在这里@Autowired用在了构造方法上。实际上,@Autowired注解可以用在类的任何方法上,甚至不需要声明用于装配的方法,直接用在声明的变量上也可以。如:

@Component
public class UserDaoImpl implements UserDao {
    @Autowired
    private CarDao carDao;

    @Override
    public void getUser() {
        System.out.println("获得用户");
        carDao.getCarName();
    }
}

运行结果:

技术分享图片

如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。为了避免异常的出现,可以将@Autowired 的 required属性设置为 false:@Autowired(required=false),此时,Spring会尝试执行自动装配,但是如果没有匹配的bean的话,Spring将会让这个bean处于未装配的状态。

2.通过Java代码装配bean

2.1 bean之间没有依赖关系

配置类:

@Configuration
public class LtConfig {
    @Bean(name="userDao")
    public UserDaoImpl userDaoImpl(){
        return new UserDaoImpl();
    }
}

创建 JavaConfig 类的关键在于为其添加@Configuration 注解,@Configuration 注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。

@Bean 注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文的 bean 。方法体中包含了最终产生 bean 实例的逻辑。默认情况下,bean 的 id 与带有 @bean 注解的方法名是一样的,也可以通过 name 属性指定一个名字。

UserDaoImpl:

public class UserDaoImpl implements UserDao{
    public void show(){
        System.out.println("调用show方法");
    }
}

测试:

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(com.lt.LtConfig.class);
        UserDao userDao = (UserDao) context.getBean("userDao");
        userDao.show();
    }
}

2.2 bean之间存在依赖

方法一:

UserDaoImpl:

public class UserDaoImpl implements UserDao{
    private CarDao carDao;

    public UserDaoImpl(CarDaoImpl carDaoImpl){
        this.carDao = carDaoImpl;
    }

    public void show(){
        System.out.println("调用show方法");
        carDao.getCarName();
    }
}

CarDaoImpl:

public class CarDaoImpl implements CarDao {
    @Override
    public void getCarName() {
        System.out.println("AE86");
    }
}

配置类:

@Configuration
public class LtConfig {

    @Bean
    public CarDaoImpl carDaoImpl(){
        return new CarDaoImpl();
    }

    @Bean(name="userDao")
    public UserDaoImpl userDaoImpl(){
        return new UserDaoImpl(carDaoImpl());
    }
}

CarDaoImpl的配置方法与之前的相同,UserDaoImpl稍微有些变化,在这里没有用默认的无参构造器来构建实例,而是调用了需要传入依赖对象的构造器来创建实例。看起来依赖对象是通过调用 carDaoImpl() 方法得到的,事实并非完全如此,因为 carDaoImpl() 方法上添加了@bean 注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的 bean,而不是每次都对其进行实际的调用。

我们可以进行测试:

UserDaoImpl:

public class UserDaoImpl implements UserDao{
    private CarDao carDao;

    public UserDaoImpl(CarDaoImpl carDaoImpl){
        this.carDao = carDaoImpl;
    }

    public void show(){
        System.out.println("调用show方法");
        carDao.getCarName();
    }

    public CarDao getCarDao(){      //获得carDao对象
        return carDao;
    }
}

配置类:

@Configuration
public class LtConfig {

    @Bean("carDao")
    public CarDaoImpl carDaoImpl(){
        return new CarDaoImpl();
    }

    @Bean(name="userDao")
    public UserDaoImpl UserDaoImpl(){
        return new UserDaoImpl(carDaoImpl());
    }

    @Bean(name="userDao2")
    public UserDaoImpl UserDaoImpl2(){
        return new UserDaoImpl(carDaoImpl());
    }
}

在配置类中,我们增加了一个方法用来创建 uerDao2,创建方法和创建 userDao 完全一样。下面看看结果。

测试:

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(com.lt.LtConfig.class);
        UserDao userDao = (UserDao) context.getBean("userDao");
//        userDao.show();

        UserDao userDao2 = (UserDao) context.getBean("userDao2");
        CarDao carDao = (CarDao) context.getBean("carDao");
        System.out.println("三个carDao对象相同吗?"+(carDao==userDao.getCarDao()&&userDao.getCarDao()==userDao2.getCarDao()));
        System.out.println("两个userDao对象相同吗?"+(userDao==userDao2));
    }
}

测试结果:
技术分享图片

结果表明:两个 userDao 中的 carDao 指向相同且都指向 carDao,但两个 userDao 指向不同。

3. 通过XML装配bean

这种装配bean的方法是最简单也是最好理解的,在此不过多阐述。

Spring学习笔记(三)

原文:https://www.cnblogs.com/miou/p/12243247.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!