Spring注解驱动开发——自动装配 方法,构造器位置的自动装配

@Autowired构造器 方法 参数 属性;都是从容器中获取参数组件的值

1 【标在方法位置】;@Bean + 方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配;
2 标在构造器上 如果组件只有一个有参构造器,这个有参构造器的@Autowired 可以省略,参数位置的组件还是可以从容器中获取
3 放在参数位置

 

一丶标在方法位置(Set 方法)

有一个Boss组件,在Boss组件里装配Car 类    在set 方法上标注 @Autowired;用@Component 标注这是一个组件, 用 @ComponentScan 扫描 该类上的包,注入到ioc 容器中

组件类

Boss

package com.mongoubiubiu.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Boss {
    
    private Car car;

    public Car getCar() {
        return car;
    }

    @Autowired //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值;
    //方法使用的参数,自定义类型的值从ioc容器中获取
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Boss [car=" + car + "]";
    }
    
    

}

Car

package com.mongoubiubiu.bean;

import org.springframework.stereotype.Component;

@Component
public class Car {
    
    
    public Car(){
        System.out.println("car constructor.....");
    }
    
    
    public void init(){
        System.out.println("car init.......");
    }
    
    public void destory(){
        System.out.println("car destory.......");
    }

}

配置类

package com.mongoubiubiu.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;


@Configuration
@ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.bean","com.mongoubiubiu.dao","com.mongoubiubiu.controller"})
public class MainConfigOfAutowired {



    @Bean("userDao2")
    public UserDao userDao(){
        
        UserDao user=new UserDao();
        user.setLable("2");
        return user;
    }
    
}

测试类

package com.mongougbiubiu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

import com.mongoubiubiu.bean.Boss;
import com.mongoubiubiu.bean.Car;
import com.mongoubiubiu.conf.MainConfigOfAutowired;
import com.mongoubiubiu.conf.MainConfigOfLifeCycle;
import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;

public class IOCTest_Autowired {
    
    
    @Test
    public void Test01(){
        //创建ioc 容器
        AnnotationConfigApplicationContext applica=    new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        //UserService userService=applica.getBean(UserServiceImpl.class);
        
        Boss boss=applica.getBean(Boss.class);
        //ioc 容器中的bean
        Car car=applica.getBean(Car.class);
        //自动装配的Car
        System.out.println(boss);
        System.out.println(car);
        //System.out.println(userService);
    } 

}

结果

 

发现ioc 容器中的bean 和 自动装配的bean 对象是一样的 说明可以通过用@Autowired 标注在Set 方法上 ,来装配  bean

 

 

二丶放在构造器上

默认加在ioc 容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作

组件类

package com.mongoubiubiu.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
//默认加在ioc 容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作
@Component
public class Boss {
    
    private Car car;
    
    
    //构造器要用的组件都是从容器中获取
    @Autowired
    public Boss(Car car){
        this.car=car;
        System.out.println("boss 有参构造器");
    }

    public Car getCar() {
        return car;
    }
 
    //@Autowired //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值;
    //方法使用的参数,自定义类型的值从ioc容器中获取
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Boss [car=" + car + "]";
    }
    
    

}

其余都和上面一样 

 

测试 发现容器中的bean 和从构造器装配的bean 为同一对象

 

 还可以放在参数上 

 

 测试 

 

 为同一对象 效果一样,之前 set 方法 也可以标注在参数上 

三 丶标在方法位置(@Bean + 方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配;

组件类

新建Color 里面的属性信息 和boss 一样 ,装配方式用 @Ben

package com.mongoubiubiu.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

public class Color {
    private Car car;

    public Car getCar() {
        return car;
    }
 
    //@Autowired //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值;
    //方法使用的参数,自定义类型的值从ioc容器中获取
    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Color [car=" + car + "]";
    }
    
    

}

配置类  用@Bean 的方式 将组件注入到容器中

package com.mongoubiubiu.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import com.mongoubiubiu.bean.Car;
import com.mongoubiubiu.bean.Color;
import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;


@Configuration
@ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.bean","com.mongoubiubiu.dao","com.mongoubiubiu.controller"})
public class MainConfigOfAutowired {



    @Bean("userDao2")
    public UserDao userDao(){
        
        UserDao user=new UserDao();
        user.setLable("2");
        return user;
    }
    
    @Bean
    public Color color(Car car){
        Color color =new Color();
        color.setCar(car);
        return color;
    }
}

 

测试类

package com.mongougbiubiu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Scope;

import com.mongoubiubiu.bean.Boss;
import com.mongoubiubiu.bean.Car;
import com.mongoubiubiu.bean.Color;
import com.mongoubiubiu.conf.MainConfigOfAutowired;
import com.mongoubiubiu.conf.MainConfigOfLifeCycle;
import com.mongoubiubiu.dao.UserDao;
import com.mongoubiubiu.service.UserService;
import com.mongoubiubiu.service.serviceImpl.UserServiceImpl;

public class IOCTest_Autowired {
    
    
    @Test
    public void Test01(){
        //创建ioc 容器
        AnnotationConfigApplicationContext applica=    new AnnotationConfigApplicationContext(MainConfigOfAutowired.class);
        //UserService userService=applica.getBean(UserServiceImpl.class);
        
        Boss boss=applica.getBean(Boss.class);
        Color color=applica.getBean(Color.class);

        //ioc 容器中的bean
        Car car=applica.getBean(Car.class);
        //自动装配的Car
        System.out.println(boss);
        System.out.println(car);
        System.out.println(color);
        //System.out.println(userService);
    } 

}

 

 

打印发现 三个bean 为同一对象 都是从容器中获取 的 ,说明 

@Bean + 方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配;

 

posted @ 2021-08-08 23:05  KwFruit  阅读(107)  评论(0编辑  收藏  举报