Spring IoC&DI

Spring是包含了众多⼯具⽅法的IoC容器

IoC:Inversion of Control(控制反转),也就是说Spring是⼀个"控制反转"的容器,其实就是把创建对象的权力交给了Spring。传统方法中,对于创建对象,是谁使用谁创建,而IoC是把创建对象交由第三方。

DI:Dependency Injection(依赖注入)。简单理解就是把第三方创建的对象拿出来使用。

IoC&DI使用

Spring是一个IoC容器,其作用就是存和取。Spring容器管理的主要是对象,这些对象,我们之为"Bean" .我们把这些对象交由Spring管理,由Spring来负责对象的创建和销毁.我们程序只需要告诉Spring,哪些需要存,以及如何从Spring中取出对象

IoC详解

Bean的存储共有两类注解类型可以实现:

  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration.(其中@Controller可以接url,其余不太需要区分,当然能区分最好)

  2. ⽅法注解:@Bean

从Spring中获取对象

java 复制代码
@SpringBootApplication
public class BookApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(BookApplication.class, args);
        MockData bean = context.getBean(MockData.class);
    }

}

其他方式重点1.2.4。且bean的名称为将第一个字母改为小写,两个以上大写开头,则不改变格式

java 复制代码
public interface BeanFactory {
    //以上省略...
    // 1. 根据bean名称获取bean
    Object getBean(String var1) throws BeansException;

    // 2. 根据bean名称和类型获取bean
    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    // 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的bean
    Object getBean(String var1, Object... var2) throws BeansException;

    // 4. 根据类型获取bean
    <T> T getBean(Class<T> var1) throws BeansException;

    // 5. 按bean类型和构造函数参数动态创建bean, 只适⽤于具有原型(prototype)作⽤域的bean
    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
    //以下省略...
}

其余四个类似。

⽅法注解@Bean

java 复制代码
@Component
public class BeanConfig {
    @Bean
    public User user(){
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }
}

注意要配合类注解使用,不能单独使用。且要是有多个同类型,通过类会匹配失败。

其bean名称为注解的方法名

扫描路径

默认启动类会扫描和自己从属同一文件下的类,且类要加注释。要扫描具体文件通过@ComponentScan({"com.example.demo"})来进行扫描

DI详解

通过@Autowired来取出所要访问的资源

属性注⼊

java 复制代码
@Autowired
private UserService userService;

构造⽅法注⼊

java 复制代码
@Controller
public class UserController2 {
    //注⼊⽅法2: 构造⽅法
    private UserService userService;
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public void sayHi(){
        System.out.println("hi,UserController2...");
        userService.sayHi();
    }
}

Setter注入

java 复制代码
@Controller
public class UserController3 {
    //注⼊⽅法3: Setter⽅法注⼊
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void sayHi(){
        System.out.println("hi,UserController3...");
        userService.sayHi();
    }
}

存在问题

java 复制代码
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    //注⼊user
    @Autowired
    private User user;
    public void sayHi(){
        System.out.println("hi,UserController...");
        userService.sayHi();
        System.out.println(user);
    }
}

其取对象的步骤如下1.先进行类型匹配,成功后进行名字匹配。2.若1失败,则直接进行类型匹配,但出现两个以上时,就会报错。

使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现(其加在对象创建中)@Qualifier注解不能单独使⽤,必须配合@Autowired使⽤使⽤(加在获取对象中)@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称(不属于Spring,属于jdk的注解)

相关推荐
onebound_noah几秒前
1688商品获取全解析:API与爬虫双轨实战指南
大数据·数据库·爬虫
接着奏乐接着舞4 分钟前
springcloud Sentinel
spring·spring cloud·sentinel
treacle田14 分钟前
达梦数据库-物理备份与还原-(DISQL联机全备+增量备份+归档进行不完全恢复或完全恢复-实践示例)-记录总结
数据库·达梦数据库物理备份还原恢复
鱼鳞_15 分钟前
苍穹外卖-Day01(开发环境搭建)
java·spring boot·spring·maven
许长安16 分钟前
Redis 渐进式 rehash:为什么要分批搬迁哈希表
数据库·redis·散列表
测试员周周23 分钟前
【Appium 系列】第09节-数据驱动测试 — YAML 数据 + parametrize
服务器·数据库·人工智能·python·测试工具·语言模型·appium
jio本小子28 分钟前
Windows 安装 Java17 + Maven + MySQL 开发环境教程,全程安装到 D 盘
windows·mysql·maven
一块小土坷垃29 分钟前
# ArchiCAD 29.0.2(畅享版):专为建筑师打造的BIM高效建模工具
前端·数据库·macos·开源软件
用户3983461612036 分钟前
Go-Spring 实战第 4 课 —— 配置校验:使用 expr 标签拦截非法配置
spring·go
中新传媒36 分钟前
德宸堂心理双师同诊
java·前端·数据库