Spring的取

1对象装配(依赖注入)

1.1.属性注入(实际开发中使用最多的,但不被官方推荐)

根据类型查找

@Autowired
private UserService userService;

1.2.Setter注入

    private UserService us;

    @Autowired
    public void setUs(UserService us) {
        this.us = us;
    }

1.3.构造函数注入

一个类默认有一个无参的构造函数,当我们写了有参的构造函数的时候,就没有这个默认无参构造函数了。

创建对象时,需要调用构造函数。

当前存在多个构造函数,Spring就不知道使用哪个了,我们需要使用@Autowired 

 1.4优缺点分析

属性注⼊的优点是简洁,使⽤⽅便;
缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常),不能注入final修饰的属性。
Setter方法注入的优点:方便在类实例之后,重新对该对象进行配置或者注入。缺点:不能注入一个final修饰的属性;注入对象可能会被改变,因为setter方法可能会被多次调用,就有被修改的风险。
构造函数注入的优点:可以注入final修饰的属性;注入的对象不会被修改;依赖对象在使用前一定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行的方法;通用性好,构造方法是JDK支持的,所以更换任何框架,他都是适用的。
缺点:注入多个对象时,代码会比较繁琐。

1.5@Resource

@Controller
public class UserController4 {
    @Resource
    private UserService us;
    @Resource(name = "user")
    private User user2;
    public void sayHi(){
        us.doService();
        System.out.println(user2.getName());
        System.out.println("hi,controller4");
    }
}

@Autowired和@Resource的区别:
出身不同:@Autowired来自于Spring,而@Resource来自于JDK 的注解;

使用时设置的参数不同,相比于@Autowired来说,@Resource支持更多的参数设置,例如name设置,根据名称获取Bean。

@Autowired可用于属性注入、Setter注入和构造函数注入,而@Resource只能用于属性注入和Setter注入,不能用于构造函数注入。

1.6同一个类型多个@Bean报错

public class BeanConfig {
    @Bean
    public Integer age(){
        return 11;
    }

//    @Bean(name={"aaa","user"})
    @Bean
    public User user(Integer age){
        User user=new User();
        user.setName("张三");
        user.setAge(age);
        return user;
    }
    @Bean
    public User user1(){
        User user=new User();
        user.setName("李四");
        user.setAge(18);
        return user;
    }
}

这个程序执行会报错,报错的原因是非唯一的Bean对象。

处理方法:

使⽤ @Resource(name="user1") 定义。
使⽤ @Qualifier 注解定义名称。
①使⽤ @Resource(name="XXX")
@Controller
public class UserController4 {
    @Resource
    private UserService us;
    @Resource(name = "user")
    private User user2;
    public void sayHi(){
        us.doService();
        System.out.println(user2.getName());
        System.out.println("hi,controller4");
    }
}

②使用@Qualifier

@Controller
public class UserController {
    @Autowired
    private UserService us;
    @Autowired
    @Qualifier(value = "user")
    private User user2;
    public void sayHi(){
        us.doService();
        System.out.println(user2.getName());
        System.out.println("hi,controller");
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李(写代码版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值