Spring 框架
Spring是一个开源的轻量级框架,核心思想是IoC和AOP,从简单性,可测试性和松耦合的角度而言任何java应用都可以从spring中受益.
优点:
- 高内聚低耦合(spring工厂用于生成本bean,可以将所有对象的创建和维护交给Spring管理;)
- AOP编程的支持(Spring提供面向切面编程,可方便实现对程序进行权限拦截,运行监控等功能.)
- 声明式事务的支持(只需配置就可以完成对事务的管理,无序手动编程)
- 方便程序的测试(Spring支持Junit4)
- 方便集成各种框架(Spring内部提供了对Struts,hibernate.MyBatisQuartz等框架的直接支持)
- 降低javaEE API的使用难度(Spring提供了对jdbc,javaMail等API的封装,使其使用难度大大降低.)
IoC容器(Inverse of Control)
IOC(控制反转)需要实例对象时直接从IoC容器中获得而不用new 的方式创建,需将实现类全限名称配置在xml文件中
配置文件.
文件位置:一般配置文件放在src下,xml文件的<beans>中
名称:一般在开发中用applicationContext.xml
内容:添加schema(计划)约束
<bean>标签:配置要创建的对象
id属性:唯一标识,从Spring容器中获得实例时使用
class属性:需创建实例的全限定类名(包名.类名)
<bean id =“person” class=“com.xalo.ertity.Person”/>
测试:
1.加载配置文件,参数为xml文件名
ApplicationContext context = new ClassPathXMLApplicationContext(“applictionContext.xml”);
2.获取对象,返回值为Object类型
Person person = (Person) context.getBean(“person”);
其中的参数为配置文件中的id
getBean方法参数中的id相同时,获取的是同一个对象.
对象的获取方式由主动变为被动,让使用者关注获取之后要做的操作,不用在进行繁琐的创建对象和赋值过程;
对象在加载配置文件时就以单例模式被创建好,等待调用,所以每次getBean获取的都是同一个对象,bean为单例对象时会有效减少服务器上的内存占有,出于节约服务器内存的目的,Spring会通过监听器监听Bean对象,如果该对象长期不使用则自动销毁,再次使用时,再次创建.
<bean>标签 lazy-init属性:是否在加载配置文件时创建对象,参数为true时在getBean时加载,此时Bean对象仍为单例模式创建.
<beans>标签 default-lazy-init 属性:统一配置多有<bean>标签的lazy-init属性,会被<bean>标签中lazy-init属性覆盖.
<bean>标签 init-method 属性和destroy-method属性:指定该Bean对象创建时执行的方法和销毁时执行的方法.
依赖注入
依赖注入即向Spring管理的对象赋值
1.构造器注入(不够灵活,不常用)
通过类中的有参构造器进行注入,要赋值的属性必须存在于构造器的参数列表中.
配置文件:
位置:<bean>标签中<constructor-arg>每个此标签代表构造器中的一个参数
value属性:给构造器的参数赋值,必须和对应的参数类型匹配.
index属性:要赋值的参数的索引,从o开始,不设置该属性,自上而下为参数注入属性
name属性:构造器的形参名
type属性:指定注入数据的类型
注:如果未指定index和name,必须安参数顺序配置
配置集合属性
list和set集合
通过<constructor-arg>标签的子标签<list>或<set>标签注入
示例:
<constructor-arg name=“list”>
创建一个list对象
<list>
给该list集合中添加元素
<value>1<value>
<value>12<value>
……
</list>
</constructor-arg>
Set集合与上相同
Map示例:
<constructor-arg name=“map”>
创建一个list对象
<map>
<entry key=“name” value=“张三”/>
……
</map>
</constructor-arg>
1.通过构造器注入bean对象
需使用<constructor-arg>标签的ref属性引用已配置的bean,ref属性的值为bean的id
示例:<constructor-arg ref=“service”/>
2.setter注入(常用)
要求类中属性有setter方法和getter方法,根据<property>标签的name属性的值去找对应方法名的setter方法而不是成员变量或setter方法的参数名.
位置:
<bean>标签的子标签<property>
<property name=“age” value=“34”/>
<property name=“service” ref =“service”/> 此处的service就是引用bean对象
3.IoC通过静态工厂模式创建对象并注入
根据id属性获取到工厂类名,在通过类名调用factory-method属性指定的静态方法,整个过程中没有创建工厂对象.
实例:
<bean id=“car” class =“com.xalo.action,CarFactory” factory-method=“getCar” >
给getCar方法传参数
<constructor-arg value=“jeep”/>
</bean>
4.IoC通过工厂方法模式创建对象并注入
工厂类中获取具体对象的方法必须不是静态方法而是成员方法
1.需要加载一个工厂
2.在要使用工厂对象来创建bean中通过factory-bean获取工厂对象,调用factory-method指定的成员方法.
实例:
<bean id = “carFactory” class=“com.xalo.action. CarFactory”></bean>
<bean id = “car” factory-bean =“CarFactory” factory-method=“getCar”>
给factory-method指定的方法传参
<constructor-arg value=“suv”>
</bean>
173万+

被折叠的 条评论
为什么被折叠?



