java八股文DI

DI

依赖注⼊是⼀个过程,是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源,⽽资源指的就是对象.我们使⽤ @Autowired 这个注解,完成了依赖注⼊的操作.简单来说, 就是把对象取出来放到某个类的属性中

关于依赖注⼊, Spring也给我们提供了三种⽅式:

  1. 属性注⼊(Field Injection)
  2. 构造⽅法注⼊(Constructor Injection)
  3. Setter 注⼊(Setter Injection)

构造器注入

1.构造器注入

java 复制代码
//创建一个水杯类
class Cup{
    public void holdCup(){
        System.out.println("水杯装水");
    }
}
//人喝水,构造器注入
class Person{
    private Cup cup;
    //构造器注入依赖
    public Person(Cup cup){
        this.cup=cup;
    }
    public void drinkWater(){
        cup.holdCup();
        System.out.println("人喝水");
    }
}

Setter方法注入

java 复制代码
class Person {
    private Cup cup;
    
    // Setter方法注入
    public void setCup(Cup cup) {
        this.cup = cup;
    }
    
    public void drinkWater() {
        cup.holdWater();
        System.out.println("喝水");
    }
}

*属性注入(重点)

通过@Autowired,将Service层类注入Controller类中

java 复制代码
@Service
public class UserService {
    public void method(){
        System.out.println("启动UserService类");
    }
}
java 复制代码
@Controller
public class UserController {
    @Autowired
    private  UserService service;

    public void method(){
        System.out.println("启动UserController类");
        service.method();
    }
}
@Autowired存在问题

当同⼀类型存在多个bean时, 使⽤@Autowired会存在问题

java 复制代码
@Data
@Component
class User{
     private String userName;
     private Integer age;

 }
@Component
public class Autowired {
    @Bean
    public User uesr1(){
        User user=new User();
        user.setUserName("zhangsan");
        user.setAge(18);
        return user;
    }
    @Bean
    public User user2(){
        User user=new User();
        user.setUserName("lisi");
        user.setAge(20);
        return user;
    }
}
java 复制代码
@Controller
public class UserController {
    @Autowired
    private  UserService service;

    @Autowired
    private User user;

    public void method(){
        System.out.println("启动UserController类");
        service.method();
        System.out.println(user);
    }
}
Spring提供了以下⼏种解决⽅案:

• @Primary

• @Qualifier

• @Resource

• @Primary:

• @Qualifier:

• @Resource

@Autowird 与 @Resource的区别:

• @Autowired 是spring框架提供的注解,⽽@Resource是JDK提供的注解

• @Autowired 默认是按照类型注⼊,⽽@Resource是按照名称注⼊. 相⽐@Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean.

总结:

属性注⼊

◦ 优点: 简洁,使⽤⽅便;

◦ 缺点:▪ 只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)

▪ 不能注⼊⼀个Final修饰的属性

• 构造函数注⼊(Spring 4.X推荐)

◦ 优点:

▪ 可以注⼊final修饰的属性

▪ 注⼊的对象不会被修改

▪ 依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法是在类加载阶段就会执⾏的⽅法.

▪ 通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的

◦ 缺点:

▪ 注⼊多个对象时, 代码会⽐较繁琐

• Setter注⼊(Spring 3.X推荐)

◦ 优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊

◦ 缺点:

▪ 不能注⼊⼀个Final修饰的属性

▪ 注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险

相关推荐
SimonKing8 小时前
紧急自查!Apifox被投毒,使用者速看:你的Git、SSH、云密钥可能已泄露
java·后端·程序员
Yupureki8 小时前
《Linux系统编程》18.线程概念与控制
java·linux·服务器·c语言·jvm·c++
帅得不敢出门8 小时前
Android Framework中调用由java编译成的jar接口
android·java·framework·jar
墨^O^8 小时前
并发控制策略与分布式数据重排:锁机制、Redis 分片与 Spark Shuffle 简析
java·开发语言·c++·学习·spark
丶小鱼丶8 小时前
数据结构和算法之【阻塞队列】上篇
java·数据结构
zb200641208 小时前
MySQL——表操作及查询
java
人道领域8 小时前
LeetCode【刷题日记】:滑动窗口算法详解:从暴力法到最优解
java·算法·leetcode
迷藏4948 小时前
# 发散创新:用Locust实现高并发场景下的精准压力测试实战在现代微服务架构中,**系统稳定性与性能瓶颈的识别能力直接决定了产品上线后
java·python·微服务·架构·压力测试
迷藏4948 小时前
**标题:发散创新:基于IPFS的去中心化文件存储与智能合约交互实战*
java·python·去中心化·智能合约·交互