目录
Spring Ioc
实现方法
基于Xml配置
基于配置类配置
基于注解配置
注意事项
依赖注入
涉及到的注解
@Data
@Configuration
@Bean
@Value
@Autowired
@Qualifier
@Resource
控制反转,将项目中所涉及到的所有对象,交给Spring负责创建和管理。
解释:普通情况下,一个对象的创建、初始化都由开发者来主动实现;在Spring中,由Spring来进行对象的创建、配置和管理。使得对象之间的依赖关系能够被自动处理,避免硬编码的耦合。
将要用的对象在 XML 文件中进行配置,Spring 通过读取 XML 文件来创建对象
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"));
}
}
如果在一个类中存在一个成员变量为另外一个类,利用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));
}
}
lombok插件中的注解。
注在类上,提供类的get、set、equals、hashCode、toString等方法,提高代码的简洁性。
Spring中的注解。
注在类上,声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
本质上是 @Component。不同点在于:
@Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。
Spring中的注解。
注在方法上将当前方法的返回值对象
放到容器当中
Spring中的注解。
在 字段 或 方法参数 或 构造函数参数 上使用,通常用于属性注入,支持SpEL
(Spring Expression Language)表达式与属性占位符的方式来注入值。
Spring中的注解。
将存在依赖关系自动注入到类中,可以用于自动装配一个类的成员变量、构造函数或者方法,以实现依赖注入。
默认按照类型装配Bean。
注意:
@Qualifier
注解来指定具体的 Bean。@Autowired
的 required
属性来控制是否强制进行依赖注入,默认值为 true
。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才会被收集注入到本方法。
Spring中的注解。
和@Autowired注解一样,都是为了装配Bean,默认按照名字装配Bean。
若没有指定name属性,则会根据这个将要被注入的属性的名字来进行Bean装配(即name属性为需要注入的属性变量名)。