beanfactory 是ioc容器的基本实现,是spring内部使用接口 面向spring本身 不提供给开发人员使用
applicationcontext是beanfactory的子接口,提供更多高级特性,面向spring的使用者,几乎所有场合都使用
applicationcontext而不是底层的beanfactory
applicationcontext 主要实现类 FileSystemXmlApplicationontext 用于项目打包 在别人电脑上运行时 获取容器
ClasspathXmlApplicationContext 自己使用这个类 获取ioc容器 在获取通过xml文件注入的bean对象。
获取方式:
Applicationcontext ac =new ClassPathXmlApplicationContext("xml文件名"); //获取ioc容器
ac.getBean()//三种形式参数 得到对象
BeanFactory
简单粗暴,可以理解为 HashMap
-
Key - bean name
-
Value - bean object
但它一般只有 get, put 两个功能,所以称之为“低级容器”。
而 ApplicationContext
多了很多功能,因为它继承了多个接口,可称之为“高级容器”。在下文的搭建项目中,我们会使用它。
何为控制,控制的是什么?
答:是 bean 的创建、管理的权利,控制 bean 的整个生命周期。
何为反转,反转了什么?
答:把这个权利交给了 Spring 容器,而不是自己去控制,就是反转。由之前的自己主动创建对象,变成现在被动接收别人给我们的对象的过程,这就是反转。
举个生活中的例子,主动投资和被动投资。
自己炒股、选股票的人就是主动投资,主动权掌握在自己的手中;而买基金的人就是被动投资,把主动权交给了基金经理,除非你把这个基金卖了,否则具体选哪些投资产品都是基金经理决定的
何为注入,注入什么?
配置文件把资源从外部注入到内部,容器加载了外部的文件、对象、数据,然后把这些资源注入给程序内的对象,维护了程序内外对象之间的依赖关系。
所以说,控制反转是通过依赖注入实现的。但是你品,你细品,它们是有差别的,像是「从不同角度描述的同一件事」
:
-
IoC 是设计思想,DI 是具体的实现方式;
-
IoC 是理论,DI 是实践;
从而实现对象之间的解藕。
当然,IoC 也可以通过其他的方式来实现,而 DI 只是 Spring 的选择。
FactoryBean 和BeanFactory区别
-
BeanFactory:负责生产和管理Bean的一个工厂接口,提供一个Spring Ioc容器规范,
-
FactoryBean: 一种Bean创建的一种方式,对Bean的一种扩展。对于复杂的Bean对象初始化创建使用其可封装对象的创建细节。
2.依赖注入 DI
就是给声明的bean对象 赋值 一般有 setter方法 或者构造器
3.ioc通过bean标签中autowire属性设置自动装配策略
使用bytype实现自动装配 ioc容器中有且至于一个类型匹配的bean才能为属性赋值 找到多个会报异常 没有空指针
byname 一般用不到 在bytype找不到的情况下才会使用
4.注解 使用注解 什么componet server controlle reporsity 首先是对类就行标记 然后需要扫描 才能将这些类给ioc管理 在xml里 使用<context: componet-scan basepackge="" > 进行初始化扫描
4.aop
jdk动态代理 实现目标类的接口 利用一个类工厂 创建代理类
public class proxyFactory(){
private Object target;
public proxyFactory(Object tarage){
this.tarage=tarage;
}
public Object getProxy(){
/**
*classLoader loader :指定加载动态生成代理类的对象
*class[] interfaces:获取目标对象的所有接口的class对象的数组
*InvocationHandler h:执行器
*/
//获取类加载器
ClassLoader classLoader=this.getclass().getClassLoader();
Class<?>[] classLoader=tarager.getclass().getInterfaces();
InvocationHandler InvocationHandler=new InvocationHandler(){
@Override
public Object invoke(Object proxy,Method method,Object[] args){
// 这里面执行核心方法
Object result=method.incoke(tarage,args);
return result;
}
}
return Proxy.newProxyInstance(classLoader,classLoader,h);
}
}
cglib动态代理 继承目标类
IOC:容器负责创建、配置和管理 bean,也就是它管理着 bean 的生命,控制着 bean 的依赖注入。
通俗点讲,因为项目中每次创建对象是很麻烦的,所以我们使用 Spring IoC 容器来管理这些对象,需要的时候你就直接用,不用管它是怎么来的、什么时候要销毁,只管用就好了。
IOC( IoC - Inversion of Control, 控制反转):四种类型注解
1.对象初始化:@Controller @Service @Reporsitory @Component
2.依赖注入 @Autowired spirng提供 @Qualifier(配合两者使用,找特定名字) @Resource jdk提供 先类型 后名字
3.作用域 @Scope(Singleton prototype request session globalsession)
4.生命周期 @PostConstruct @PreDestroy
5.xml的数据源 步骤
1.properties文件(配置root密码数据源信息)
2.xml 里面引入 properties文件 (<context:properties-placeholder location:="">)
3.xml 里面配置数据源信息 被ioc管理;