一 、什么是自动注入
springboot利用依赖注入,完成对IOC容器中各个组件的依赖关系的赋值
二、springboot注入的方式
1、使用@AutoWired自动注入【Spring定义的】
1、默认按照类型去容器中找对应的组件 applicationContext.getBean(BookDao.class),找到就赋值 2、如果未找到相同类型的组件,再将属性名作为组件的id去容器中查找 applicationContext.getBean("bookDao") 3、@Qualifier("bookDao"):使用该注解来指定需要装配的组件的id,而不是使用属性名 4、自动装配默认一定要将属性赋值好,没有就会报错,可通过在Autowire的注解中将required=false来使该配置设置为非必需 5、@Primary:让Spring进行自动装配的时候,默认使用首选的bean,也可以继续使用@Qualifier来指定需要装配的bean
实例代码如下:
1、创建service和dao层
package com.example.demo.service;
@Service
public class BookService {
@Autowired
BookDao bookDao;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao +
'}';
}
}
package com.example.demo.dao;
@Repository
public class BookDao {
}
2、创建配置类,并通过扫描的方式注册bean
package com.example.demo.config;
//告诉Spring这是一个配置类
@Configuration
@ComponentScan({"com.example.demo.*"})
public class MainConfig {
}
3、测试看service是否注入了dao
@SpringBootTest
class DemoApplicationTests {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
@Test
void contextLoads() {
BookService bookService = applicationContext.getBean(BookService.class);
System.out.println(bookService);
}
}
可以看到service成功注入了dao
BookService{bookDao=com.example.demo.dao.BookDao@499b2a5c}
2、使用@Resource和@Inject自动注入【java规范】
1、@Resource:可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;没有能支持@Primary的功能以 @Autowired(required=false)的功能 2、@Inject(需要导入依赖)导入javax.inject的包,和Autowired的功能一样,没有required=false的功能 AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
我们将刚才的代码修改成@Resource注入dao
@Service
public class BookService {
@Resource
BookDao bookDao;
@Override
public String toString() {
return "BookService{" +
"bookDao=" + bookDao +
'}';
}
}
依然能完成自动注入
BookService{bookDao=com.example.demo.dao.BookDao@43c67247}
3、使用@Autowired在方法、构造器,构造器参数,上注入
1)标注在方法位置:标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值,方法使用的参数类型的值从ioc容 器中获取,方法参数的值默认从ioc容器中获取 2)标注在构造器位置 默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作。标注在构造器 上可以默认调用该方法,方法中用的参数同样从ioc容器中获取,如果容器只有一个有参构造器,这个有参构造器的Autowired可 以省略,参数位置的组件还是可以自动从容器中获取 3)标注在构造方法的参数位置 从ioc容器中获取参数组件的值
1、标注在构造器上进行注入,如果容器只有一个有参构造器,Autowired可以省略
@Service
public class BookService {
@Autowired
public BookService(BookDao bookDao) {
System.out.println(bookDao);
}
}
2、标注在方法上进行注入,可以省略
@Service
public class BookService {
@Autowired
public void setBookService(BookDao bookDao) {
System.out.println(bookDao);
}
}
3、标注在构造方法的参数上
@Service
public class BookService {
public BookService(@Autowired BookDao bookDao) {
System.out.println(bookDao);
}
}
4、@Bean标注的方法创建对象的时候,方法参数的值默认从ioc容器中获取,默认不写Autowired,注入效果是一样的
@Configuration
@ComponentScan({"com.example.demo.*"})
public class MainConfig {
@Bean
public BookService bookService(BookDao bookDao)
{
System.out.println(bookDao);
return new BookService();
}
}