源码框架-Spring IOC-06-自动装配

本文深入解析Spring框架中@Autowired注解的使用方法,包括其默认的必需依赖特性、如何通过设置required属性来改变这一行为,以及如何使用@Qualifier注解来指定特定的组件进行装配。同时,对比了@Resource和@Inject注解的功能差异。

一、@Autowired用法

1、@Autowired注解默认当前的依赖是必须的

可以通过@Autowired(required = false)将required属性的值设置为false来消除这种错误。
 

@Repository

public class UserDao {

    public UserDao() {

        System.out.println("创建构造器UserDao");

    }



    private int flag=1;



    public int getFlag() {

        return flag;

    }



    public void setFlag(int flag) {

        this.flag = flag;

    }



    @Override

    public String toString() {

        return "UserDao{" +

                "flag=" + flag +

                '}';

    }

}



@Service

public class UserService {



    @Autowired

    private UserDao userDao;



    public UserService() {

        System.out.println("创建构造器UserService");

    }



    @Override

    public String toString() {

        return "UserService{" +

                "userDao=" + userDao +

                '}';

    }

}



@ComponentScan(basePackages = {"com.bert.assembly"})

public class AssemblyConfig {



}



public class AssemblyMain {



    public static void main(String[] args) {

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AssemblyConfig.class);

        UserService userService = (UserService) ctx.getBean("userService");

        System.out.println(userService);

    }

}

运行结果:

创建构造器UserDao
创建构造器UserService
UserService{userDao=UserDao{flag=1}}

 

2、假设我们需要指定特定的组件来进行装配,我们可以通过使用@Qualifier("tulingDao")来指定装配的组件

@Service

public class UserService {

 

    @Autowired

    @Qualifier(value = "userDao2")

    private UserDao userDao;

 

    public UserService() {

        System.out.println("创建构造器UserService");

    }

 

    @Override

    public String toString() {

        return "UserService{" +

                "userDao=" + userDao +

                '}';

    }

}

@ComponentScan(basePackages = {"com.bert.assembly"})

@Configuration

public class AssemblyConfig {

 

    @Bean

    public UserDao userDao2() {

        UserDao userDao = new UserDao();

        userDao.setFlag(2);

        return userDao;

    }

}

 

运行结果:

创建构造器UserDao

创建构造器UserService

创建构造器UserDao

UserService{userDao=UserDao{flag=2}}

 

3、@Resource(JSR250规范) 功能和@AutoWired的功能差不多一样,但是不支持@Primary 和@Qualifier的支持

4、@InJect(JSR330规范) 需要导入jar包(javax.inject)依赖 功能和支持@Primary功能 ,但是没有Require=false的功能

5、使用autowired标注在不同地方

可以标注在set方法上

@Autowired

public void setUserDao(UserDao UserDao) { this.UserDao = UserDao;

}

标注在构造方法上

@Autowired

public UserService(UserDao UserDao) { this.UserDao = UserDao;

 }

标注在配置类上的入参中(可以不写)

@Bean

public UserService UserService(@Autowired UserDao UserDao) {

 UserService UserService = new UserService(UserDao);

 return UserService;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值