Spring Ioc
- 定义:Inversion of Control,控制反转,面向对象思想
- 实现方式:依赖注入
对象
创建
通过new操作符调用构造方法创建对象,每实例化一个对象自动调用一次构造方法
Test test=new Test();
Test test=new Test("a");
访问对象的属性和行为:
对象.类成员
t1.call();
对象的引用:
类名 对象引用名称
Book book;
Book book=new Book();
Bean
定义
SpringIoC容器的实例化,组装和管理的对象,在web项目中,Spring容器自动创建扫描bean装置到容器中(Spring容器是自动创建的)
SpringIoC的作用:
避免bean之间的耦合,通常对象之间调用方法是new一个A,newB,把a.set()传入B,修改A就要修改B,通过配置文件描述bean之间的关系,自动实例化bean,bean与bean之间不产生关联
bean被扫描到的条件
- 在配置类所在包以及子包下
- 需要有注解
bean用到的注解
- @Component 都能用
- @Controller 处理请求
- @Service 开发业务组件
- @Repository数据库访问
- @Autowired依赖注入,加在成员变量之前,set方法之前,构造器之前
- @Configuration声明配置类
//测试代码与正式环境配置类相同,启用正式类为配置类
@ContextConfiguration(classes = CommunityApplication.class)
- @Qualified有多个类型的bean,通过名称指定
- @Bean定义第三方bean,可以装配任意bean
- @RequestMapping
//浏览器需要访问方法的前提是要有注解声明,声明路径
@RequestMapping("/data")
- @Primary满足类有两个,添加注解有更高优先级
主动获取Bean
//通过类型获取bean
AlphaDao alphaDao = applicationContext.getBean(AlphaDao.class);
System.out.println(alphaDao.select());
//通过名字获取bean,得到的类型默认返回是object,通过AlphaDao.class强制转型
alphaDao = applicationContext.getBean("alphaHibernate",AlphaDao.class);
System.out.println(alphaDao.select());
依赖注入获取Bean
//以上都是主动获取bean,比较麻烦,更简便的方式为依赖注入
//当前bean要注入AlphaDao
//注入注解:@Autowired,加在成员变量之前,set方法之前,构造器之前
@Autowired
//希望注入的不是默认优先级,而是Hibernate
@Qualifier("alphaHibernate")
private AlphaDao alphaDao;
Spring管理bean的作用域/有效范围
//被Spring容器管理的bean默认是单例的,只初始化一次,也只销毁一次
//如果不希望单例,希望在每次getBean都新建一个实例;@Scope默认参数“singleton”,通常都是单例
//@Scope("prototype")
getBean按照类型获取,接口满足的类有多个
@Repository
//getBean按照类型获取,接口满足条件的类有两个,使用注解@Primary bean有更高优先级;
//想把bean替换掉,加一个新的bean,调用的地方依赖的不是bean本身而是接口
// AlphaDao.class——采用面向接口思想,
// 优点:bean变了代码不变,降低bean之间耦合度
// 缺点:一部分用Hibernate的bean,一部分用Mabatis的bean的话:自定义bean的名字,通过名字强制返回bean
// bean默认名字是类名(首字母小写),类名也可以自定义@Respository(“字符串”)
@Primary
ApplicationContext
@Override
//哪个类想得到Spring容器,使用接口ApplicationContext
//ApplicationContext是BeanFactory的子接口,功能更强,BeanFactory是Spring容器的顶层接口
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//记录Spring容器ApplicationContext,为了后续使用
this.applicationContext = applicationContext;
}
//测试方法,在方法中使用ApplicationContext容器
@Test
public void testApplicationContext(){
System.out.println(applicationContext);