自学内容网 自学内容网

Spring Ioc详解

目录

Spring Ioc

实现方法

基于Xml配置

基于配置类配置

基于注解配置

注意事项

依赖注入

涉及到的注解

@Data

@Configuration

@Bean

@Value

@Autowired 

@Qualifier

@Resource


Spring Ioc

控制反转,将项目中所涉及到的所有对象,交给Spring负责创建和管理。

解释:普通情况下,一个对象的创建、初始化都由开发者来主动实现;在Spring中,由Spring来进行对象的创建、配置和管理。使得对象之间的依赖关系能够被自动处理,避免硬编码的耦合。

实现方法

基于Xml配置

将要用的对象在 XML 文件中进行配置,Spring 通过读取 XML 文件来创建对象

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置 User 对象 -->
    <bean class="com.southwind.entity.User" id="user">
        <property name="id" value="1"></property>
        <property name="name" value="张三"></property>
    </bean>

</beans>
package com.southwind.test;

import com.southwind.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载Spring IoC,读取 XML 文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        System.out.println(applicationContext.getBean("user"));//使用对象id的方式读取对象
        System.out.println(applicationContext.getBean(User.class));//使用类方法名的方式读取对象
    }
}

基于配置类配置

在配置类的方法中添加对应注解

package com.southwind.configuration;

import com.southwind.entity.Account;
import com.southwind.entity.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfiguration {
    
    @Bean(name = "config")
    public User user(){
        User user = new User();
        Account account = new Account();
        account.setTitle("用户1号");
        user.setName("张三");
        user.setId(1);
        user.setAccount(account);
        return user;
    }
    
}
package com.southwind.test;

import com.southwind.configuration.BeanConfiguration;
import com.southwind.entity.Account;
import com.southwind.entity.Student;
import com.southwind.entity.User;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载Spring IoC,基于配置类
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfiguration.class);
        System.out.println(applicationContext.getBean(User.class));
        System.out.println(applicationContext.getBean("config"));
    }
}

基于注解配置

不需要 XML 配置文件,只需要将要注入的 bean 通过注解进行配置即可,即给目标类添加 @Component 注解

package com.southwind.entity;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Data
@Component("config")
public class User {
    @Value("1")
    private Integer id;
    @Value("张三")
    private String name;
}
package com.southwind.test;

import com.southwind.entity.User;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载Spring IoC,基于注解的方式
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.southwind.entity");
        System.out.println(applicationContext.getBean(User.class));
        System.out.println(applicationContext.getBean("test"));
    }
}

注意事项

  1. 需要有无参构造函数,默认是通过无参构造函数创建对象
  2. 属性需要有 setter 方法,通过反射机制调用 setter 方法完成属性的赋值
  3. XML 方式配置比较繁琐,现在的开发不建议使用 XML 方式,Spring Boot 中已经不再使用 XML 方式来配置 bean

依赖注入

如果在一个类中存在一个成员变量为另外一个类,利用Spring来进行配置这个成员变量的过程称为依赖注入。

@Data
@Component("config")
public class DataConfig{
    @Value("localhost:3306")
    private String url;
    @Value("Driver")
    private String username;
    @Value("root") 
    private String password;

}
@Data
@Component
public class GlobalConfig{
    @Value("8080")
    private String port;
    @Value("/")
    private String path;
    @Autowired //使用类型来进行映射
    private DataConfig dataConfig ;
    
    //@Autowired 
    //@Qualifier("config")//使用id名字来进行映射
    //private DataConfig dataConfig ;
}
package com.southwind.test;

import com.southwind.entity.User;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载Spring IoC,基于注解的方式
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.southwind.entity");
        System.out.println(applicationContext.getBean(GlobalConifg.class));
    }
}

涉及到的注解

@Data

lombok插件中的注解。

注在类上,提供类的get、set、equals、hashCode、toString等方法,提高代码的简洁性。

@Configuration

Spring中的注解。

注在类上,声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。

本质上是 @Component。不同点在于:@Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。

@Bean

Spring中的注解。

注在方法上将当前方法的返回值对象放到容器当中

@Value

Spring中的注解。

在 字段 或 方法参数 或 构造函数参数 上使用,通常用于属性注入,支持SpEL (Spring Expression Language)表达式与属性占位符的方式来注入值。

@Autowired 

Spring中的注解。

将存在依赖关系自动注入到类中,可以用于自动装配一个类的成员变量、构造函数或者方法,以实现依赖注入。

默认按照类型装配Bean。

注意:

  1. 在进行依赖注入时,需要确保注入目标的类型和上下文中的 Bean 类型是兼容的,否则可能会导致注入失败。
  2. 如果有多个候选 Bean,可以使用 @Qualifier 注解来指定具体的 Bean。
  3. 可以使用 @Autowired 的 required 属性来控制是否强制进行依赖注入,默认值为 true

@Qualifier

Spring中的注解。

该注解可以使用在类上、属性上、参数上、方法上

类上:@Qualifier注解里面填写的值就是当前类注入到IOC容器的bean的唯一标识(id),再使用到该Bean的地方就可以直接根据唯一标识(id)从IOC容器中获取了

属性上:@Qualifier 和 @Autowired结合使用可以通过唯一Bean的id实现自动装配,因为单独的@Autowired注解实现自动装配是按照类型优先原则的,一旦IOC容器中出现了两个类型一样的Bean,@Autowired注解就会无法辨别用那个,即而报错,但是当我们加上 @Qualifier(value = "Bean的id") 的时候就可以直接通过Bean的唯一标识(id)进行装配了。

参数上:在@Configuration注解进行bean申明的时候方法参数列表中使用;在参数上时通@Qualifier注解指定Bean的唯一标识,让参数的指定的Bean绑定起来;具有同样指定Bean唯一标识的@Resource在此无法在参数中使用。

方法上,@Qualifier起到了一个筛选的作用,只有加了@Qualifier注解的Bean才会被收集注入到本方法。

@Resource

Spring中的注解。

和@Autowired注解一样,都是为了装配Bean,默认按照名字装配Bean。

若没有指定name属性,则会根据这个将要被注入的属性的名字来进行Bean装配(即name属性为需要注入的属性变量名)。


原文地址:https://blog.csdn.net/qq_33697759/article/details/142244352

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!