一 、什么是自动注入

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

springboot引入mysql依赖 springboot怎么依赖注入_System

实例代码如下:

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();
    }
}