一。自动装配
1.装配:把bean对象装到IOC容器
@Autowired
private RedisTempate redisTemplate ————这个叫自动装配
2.自动装配的各个阶段
第一阶段:采用注解的方式和xml指定扫包范围
@Controller @Service @Repository @Component
context:component-scan/package="
第二阶段:javaConfig去XML化
@Configuiration
@import 等价于 <import resource="" /> 等价于导入另外一个配置文件
第三个阶段 Enable自动装配 spring4出现的功能
@EnableWebMvc
@EnableCaching
@EnableAutoConfiguration 开启自动装配
3.导入maven包,控制器为什么能直接用@Autowired RedisTemplate redisTemplate
答:1.首先装到容器 (下面讲什么时候装到容器,如何装到容器)
2.然后从容器获取到(这个见手写IOC @Autowired的偷梁换柱)
Web-Inf下的spring.factories文件夹下有配置文件RedisAutoConfiguration这个文件会被selectImports方法扫描到,然后一层层往上
@SpringBootApplication——@EnableAutoConfiguration——@Import(AutoConfigurationImportSelector.class)——selectImports方法
由于有@Import(AutoConfigurationImportSelector.class),这个相当于导入一个配置文件(selectImports方法),就有容器和bean
相当于主启动类有一个容器里面有各个Bean
二。获取Sping容器
父类:AbstracApplicationContext 运用了模板方法,钩子方法是refresh
springboot启动的是 EmbeddedWebApplicationContext
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-redis.xml);
FileSystemApplicationContext context = new FileSystemApplicationContext("classpath:application.xml");
AnnotaionconfigApplicationContext context = new AnnotationConfigApplicationContext(SpringRedisconfig.class);
AnnotaionconfigApplicationContext context = new AnnotationConfigApplicationContext("com.xiagnxue");
//调用上面这个方法,就可以拿到包下的所有类 context.getBean(类首字母小写)
ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args); //SpringBoot的主启动类
第一种:SpringUtil
//1.SpringUtil
@Component
public class SpringUtil extends ApplicationObjectSupport {
public static ApplicationContext context;
public static Object getBean(String serviceName){
return context.getBean(serviceName);
}
@Override
protected void initApplicationContext(ApplicationContext context) throws BeansException {
super.initApplicationContext(context);
SpringUtil.context = context;
}
}
//2.使用
ApplicationContext context = SpringUtil.context; //获取Spring容器
PayServiceUtil payServiceUtil = context.getBean(PayServiceUtil.class); //获取bean
Map<String, PayService> payMap = context.getBeansOfType(PayService.class); //获取接口的所有实现类
第二种:PayServiceUtil
@Component
public class PayServiceUtil implements ApplicationContextAware {
//1.初始化Spring容器对象
private ApplicationContext applicationContext;
//2.获取Springr容器对象
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
//3.使用容器对象
Map<String, PayService> payMap = applicationContext.getBeansOfType(PayService.class);
第三种AppConfig方法
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Person person = context.getBean(Person.class); 或者 Person person = context.getBean("getPerson")
system.out.printlin(person);
}
}
@ComponentScan("com.base")
@Configuration //相当于这个java类一个配置文件 beans.xml
public class AppConfig {
@Bean
Perseon getPerson(){
retun new Person("张三","20");
}
}
第四种NonAppConfig方法(第三种合二为一)
@ComponentScan("com")
public class TestNoAppConfig {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainApplication.class);
DeptService deptService = context.getBean(DeptService.class);
deptService.delete(new Dept());
}
}
第五种 启动类
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);
}
}