官方定义:IoC又叫依赖注入(DI)。它描述了对象的定义和依赖的一个过程。依赖的对象通过构造参数、工厂方法参数或者属性注入,当对象实例化后依赖的对象才被创建,当创建bean后容器注入这些依赖对象。这个过程基本上是反向的。
方法详情
例如你在一个类上加上一个@Component注解,它在配置类的@ComponentScan注解扫描的包下,或者把这给个类在配置类中加上@Bean注解,那么它就被识别为Bean,加入到Spring容器里。
@Component
public class FirstBean {
}
或者直接把这个类在Spring配置类里实例化然后使用@Bean注解。
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {
@Bean
public FirstBean firstBean() {
return new FirstBean();
}
}
@Component
public class SecondBean {
private FirstBean firstBean;
@Autowired
public SecondBean(FirstBean firstBean) {
this.firstBean = firstBean;
}
@Override
public String toString() {
return "SecondBean{firstBean=" + firstBean + '}';
}
}
一个Bean要调用另一个Bean,直接调用是允许的,需要通过自动装配注解@Autowired进行依赖注入才能达成目的。
注解 | 解释 |
---|---|
@Configuration | 标记的类是配置类 |
@ComponentScan(“包”) | 指定哪个包,就扫描哪个包下的注解并识别。 |
@Autowired | Bean的自动装配,可以标注在类的属性、方法及构造函数上。 |
@Component | 把普通类标记为Bean,加入到容器里,并且是单例模式。 |
@Bean | 定义一个Bean对象,加入到Spring容器里 |
@Order(数字) | 容器加载Bean的优先级,数字越小优先级越高 |
我们将构造方法注入、工厂方法注入或者属性注入三种注入方式进行细化,依赖注入的方式具体如下:
首先通过Configuration和@ComponentScan创建一个Spring的配置类。
@Configuration
@ComponentScan("com.imooc.spring.demo.bean")//项目的包名
public class SpringBeanConfiguration {
}
新建一个类FirstBean,通过@Component注解标记为Bean,加入到Spring容器里。
@Component
public class FirstBean {
}
@Component
public class SecondBean {
private FirstBean firstBean;
@Autowired
public SecondBean(FirstBean firstBean) {
this.firstBean = firstBean;
}
@Override
public String toString() {
return "SecondBean{firstBean=" + firstBean + '}';
}
}
@Component
public class ThirdBean {
private FirstBean firstBean;
@Autowired
public void setFirstBean(FirstBean firstBean) {
this.firstBean = firstBean;
}
@Override
public String toString() {
return "ThirdBean{firstBean=" + firstBean + '}';
}
}
@Component
public class FourthBean {
@Autowired
private FirstBean firstBean;
@Override
public String toString() {
return "FourthBean{firstBean=" + firstBean + '}';
}
}
新建一个类FifthBean,标记为Bean。 加入一个List类型 的属性,用@Autowired注入。
在配置类中对加入一个返回值为List的方法或者加两个返回String的方法,使用Bean注解,这样就完成集合的赋值。
@Component
public class FifthBean {
@Autowired
private List<String> stringList;
public List<String> getStringList() {
return stringList;
}
}
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {
@Bean
public List<String> stringList() {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("imooc");
return list;
}
}
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {
@Bean
public String firstString() {
return "bye";
}
@Bean
public String secondString() {
return "imooc";
}
}
class BeanDeoTest {
@Test
public void test() {
ApplicationContext applicationContext =
AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
SecondBean secondBean = applicationContext.getBean("secondBean", SecondBean.class);
ThirdBean thirdBean = applicationContext.getBean("thirdBean", ThirdBean.class);
System.out.println(secondBean.toString());
System.out.println(thirdBean.toString());
}
}
ApplicationContext用来获取配置类,getBean函数用来获取指定的Bean对象。
对比几种装配Bean的方式
最原始的装配Bean的方式是XML
语句,这也是Spring最早的注入方式。
<context:component-scan base-package="com.imooc.spring.demo"/>
<bean id="firstbean" class="FirstBean" />
上文的测试类就是使用ApplicationContext进行上下文的获取,然后通过getBean进行Bean的注入。
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(SpringBeanConfiguration.class);
SecondBean secondBean = applicationContext.getBean("secondBean", SecondBean.class);
注解注入的优点
程序员干货,职场必备技能,科技前沿资讯,尽在Mess科技!