01Ioc容器设计理念和核心注解的使用
one question— BeanFactory
和 applicationContext
的本质区别是什么?
1. applicationContext 是 BeanFactory 的一个功能的扩展
2. BeanFory 启动时候不去实例化bean,调用的时候才实例化对象(懒加载). ApplicationContext的启动即实例化bean(非懒加载,但可以指定为懒加载)
Spring容器集成图:
这个图肯定很多人见过了,我们主要看画圈圈的3个地方。这三个是常用且重要的。
控制反转和依赖注入
重要思想:依赖倒置原则
ioc的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。
第一,资源集中管理,实现资源的可配置和易管理。第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度
示意图解:
你要找小姐姐嘿嘿嘿,你要有钱+房子+车子+活好,只有这样你才能找到小姐姐,但是现在呢你只要有钱并且通过酒店就可以和小姐姐嘿嘿嘿了. 其实这就是ioc的一种思想.更少的条件来使用资源
代码转变:
userService{
UserDao userDao = new UserDao();
}
变成/
userService{
@AutoWired
private UserDao userDao;
}
spring ioc容器底层注解使用
1.基于xml的来定义bean信息
<bean id="Person" class="<包名>"></bean>
然后再容器中读取Bean
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("<指定的xml>");
system.out.println(ctx.getBean("Person"))
2.@Bean方式
@Configuration
public class Main{
@Bean
public Person person(){
return new Person();
}
}
注意: 通过@Bean的形式是使用的话, bean的默认名称是方法名,若@Bean(value=“bean的名称”) 那么bean的名称是指定的
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Main.Class);
system.out.println(ctx.getBean("Person"))
在配置类上写@CompentScan
注解来进行包扫描
@Configuration
@ComponentScan(basePackages = {"<被扫描的对应的包名>"})
public class MainConfig { }
1.排除用法 excludeFilters(排除@Controller注解的,和<指定的类>的)
@ComponentScan(basePackages = {"<被扫描的对应的包名>"},excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class}),
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {<指定的类名>.class})
})
2.包含用法 includeFilters ,注意,若使用包含的用法,需要把useDefaultFilters属性设置为false**(**true表示扫描全部的)
@ComponentScan(basePackages = {"<被扫描的对应的包名>"},includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,value = TulingFilterType.class)
},useDefaultFilters = false)
3.@ComponentScan.Filter
Custom 自定义的使用方法:
@ComponentScan(basePackages = {"<指定的包名>"},includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,value = TulingFilterType.class)
},useDefaultFilters = false)