Spring Ioc详解
目录
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"));
}
}
注意事项
- 需要有无参构造函数,默认是通过无参构造函数创建对象
- 属性需要有 setter 方法,通过反射机制调用 setter 方法完成属性的赋值
- 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。
注意:
- 在进行依赖注入时,需要确保注入目标的类型和上下文中的 Bean 类型是兼容的,否则可能会导致注入失败。
- 如果有多个候选 Bean,可以使用
@Qualifier
注解来指定具体的 Bean。 - 可以使用
@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)!