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⽅法可能会被多次调⽤, 就有被修改的⻛险

相关推荐
黎雁·泠崖2 小时前
Java常用类核心详解(一):Math 类超细讲解
java·开发语言
大尚来也2 小时前
跨平台全局键盘监听实战:基于 JNativeHook 在 Java 中捕获 Linux 键盘事件
java·linux
追随者永远是胜利者2 小时前
(LeetCode-Hot100)15. 三数之和
java·算法·leetcode·职场和发展·go
懒惰成性的3 小时前
12.Java的异常
java·开发语言
装不满的克莱因瓶3 小时前
Java7新特性:try-with-resources写法
java·前端·javascript·jdk·新特性·jdk7
前路不黑暗@3 小时前
Java项目:Java脚手架项目的通用组件的封装(六)
java·开发语言·spring
chilavert3184 小时前
技术演进中的开发沉思-368:锁机制(中)
java·开发语言·jvm
~央千澈~4 小时前
抖音弹幕游戏开发之第12集:添加冷却时间机制·优雅草云桧·卓伊凡
java·服务器·前端
HAPPY酷5 小时前
C++ 多线程实战三板斧
java·开发语言·c++·技术美术