IoC容器
1.BeanFactory()需要配置绝对路径
2.ApplicationContext()
BeanFactory
//初始化Spring容器,加载配置文件
BeanFactory beanFac = new XmlBeanFactory(
new FileSystemResourece("spring配置文件绝对路径"));
//通过容器获取实例
TestDao tt = (TestDao)beanFac.getBean("test");
ApplicationContext
- 通过ClassPathXmlApplicationContext创建
//初始化Spring容器,加载配置文件
ApplciationContext aapCon = new ClassPathXmlApplicationContext(
"spring配置src根目录");
- 通过FileSystemXmlApplicationContext创建
//初始化Spring容器,加载配置文件
ApplciationContext aapCon = new FileSystemXmlApplicationContext(
"spring配置文件绝对路径");
- 通过Web服务器实例化ApplicationContext容器
通过在web.xml文件中配置spring监听器,加载spring-web-x.x.x.RELEASE.jar包
<!--指定以ContextLoaderLIstener方式启动sprin容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--加载src目录下的applicationContext.xml文件-->
<!--contextConfigLocation字段是预先已经在包里面设定好的,如果不匹配会注入失败-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
依赖注入
- 构造注入
- setter注入
两者都是通过采用Java的反射机制完成 注入
1.构造注入
通过构造方法完成依赖注入
步骤
1.在目标需要注入的类中为需要注入的变量在构造方法中增加对应的形参
2.在配置文件中为该类增加对应的标签
<!--constructor-arg标签用于定义类构造方法的参数,
index用于定于参数的位置,ref为某个实例的引用,如果为常量值,则换成value-->
<bean id="" class="">
<constructor-arg index="0" ref=""/>
</bean>
2.setter注入
通过javaBean规范所定义的setter方法完成依赖注入,spring中为主流
步骤
1.在目标需要注入的类中创建结构对象,并为其生成setter方法
2.在配置文件中为该类增加对应的标签
<bean id="" class="">
<property name="" ref=""/>
</bean>
3.关于java反射
一个类不需要导入类所在的包,只需要知道类的完整路径就可以知道该类的所有信息,甚至不需要明确的类型信息,都用object表示,即我们直接通过类路径拿到目标类的class对象的引用,从而对该类进行操作(c每个类都会用一个class对象,class对象可以用来创建所有常规对象,存储在每个类对应得到.class文件中)
获取类的class对象
- 通过object的getClass方法
2.通过Class.forName()方法
3.使用类名.class
spring采用的反射机制(getBean())
1.根据类名获取类对象(从spring配置文件中获取)
Class<?> objClass = class.forName("类名");
2.从类对象获取setter方法(从spring配置文件中获取,可以是数组表示多个参数)
Method setNameMethod = objClass.getMethod("方法名",参数类型)
3.有的方法是private,设置方法的访问属性为可访问
setNameMethod.setAccessible(true);
4.实例化对象
Object obj = objClass.newInstance();
5.调用方法进行注入
setNameMethod.invoke(obj,对象实例(new一个))
SpringBean
Bean的实例化
- 构造方法实例化
- 静态工厂实例化
- 实例工厂实例化
构造方法实例化
不通过工厂,直接通过applicationContext.getBean来获取实例
静态工厂实例化
建立一个工厂类,其中工厂变量设为private static,通过静态方法返回该工厂的静态对象引用,再通过该静态工厂对象来获取bean对象,所有方法都使用同一个工厂对象,减少了资源的损耗
实例工厂实例化
与前者不同的是,前者返回静态工厂对象,而该类返回的是new BeanFactory,即每一次获取的工厂对象都不同,会动态创建工厂对象
作用域
作用域名称 | 描述 |
---|---|
singleton | 默认得到作用域,且在spring容器中只会存在唯一实例,即获取的所有目标Bean都引用自同一对象实例 |
prototype | 每次获取Bean,都会返回新的Bean实例 |
request | 在一个HTTP请求中返回一个实例,不同的HTTP请求返回的Bean对象不同 |
session | 在同一个HTTP Session中返回的Bean实例相同 |
application | 为每一个ServletContext对象创建一个实例 |
Bean的生命周期
singleton作用域的Bean,spring容器可以知道Bean何时创建、初始化、销毁。
而prototype作用域的Bean,spring容器只负责创建,交由客户端代码负责
大致过程为:实例化->初始化->接受请求->销毁
通过在Bean不被需要时进行销毁,但也可以通过实现DisposableBean接口调用destory方法或者在配置文件通过destory-method属性指定Bean的销毁方式
Bean得到装配方式
基于XML
<bean id="" class="">
...需要注入的参数配置
</bean>
基于注解
@Component
放在类前,表示该类为Bean,可以作用在任何一个层次上
默认Bean的id为类名第一个字母小写,也可以通过在括号内填写确定的id
@Component("test")
class Test{
pass;
}
@Value
放在变量前,为变量注入简单值,目前来说引用的复杂值还不可使用
@Value("张三")
private String name;
//省略get/set方法
@Repository
用于访问Dao层
@Service
用于访问业务逻辑层
Controller
用于Controller控制器组件类
上面三者的作用与@Component一模一样,只是名字不一样,主要让我们更清楚目标类的作用
@Autowired
对成员变量、方法及构造方法进行标注,完成自动的装配工作,不需要get/set方法,即只要跟了一个@Autowired,调用时,spring容器会为其自动根据类型完成注入,如需要指定bean注入
则通过@Qualifier(“id名”)对其完成目标bean的注入
@Resource
相当于@Autowired和@Qualifier(“id名”)的综合,但只需要一句,更加方便
配置注解
完成前者的注解装配,还需要在spring容器的xml文件中完成配置注解
<!--对目标包完成其所有实现类的注解分析-->
<context: component-scan base-package="Bean所在的包路径">