Struts1和hibernate不能提高效率
多个session可以使用同一个事物
Struts1其实不能提高效率,自始自终都是单例,虽然保证了安全,但是没有效率。
Spring的引入使代码清晰,提高了效率
1.Spring可以自动生成session和事务
2.Hibernate和struts集成必须要有拦截器,而spring可以自动提供编码过滤器和懒加载过滤器。
Spring是以一种业务层框架:
1.会自动生成业务对象
功能
1.IOC容器
利用Spring来创建对象并完成关系组装,比如能自动生成单例对象。
自动生成对象
完成对象之间的关联
根据需求决定生成单例还是多例
2.AOP面向切面编程的技术,采用动态代理技术,比如增删改查,代码已经写好了,但有新的需求,要加权限验证和加日志,按照传统的方式,要修改源代码,但这样代价太大了,风险很大,如可能会引入新的错误。如果按照AOP,在不知道源码的情况下,可以增加功能。
比如过滤器Filter,和利用spring进行事务处理
如今开发需求,也是用AOP的思想去考虑
对原有的方法的基础上,为其增加新的功能,这种方式也叫做横切性问题。
3.代替其他框架完成新的功能
比如替struts1生成多例的Action
替hibernate生成全局性的事务,真正的做到了安全性和并发性的统一
替很多的框架生成很多自动的功能:比如懒加载和编码过滤器。
springmvc是spring家族的一部分,可以自动集成
作用:
1.生成session工厂:表示层struts1作为表示层,因为Action就是单例的。然而spring生成Action虽然表面上市单例的,但实质上是多例的。
2.对持久层:可以生成全局性的事务,session对每个事务共享,把安全级别降低到session上,假如有100个session,而且并发,事务一提交,但只有一个session去临时集合中生成缓存。
3.替很多的框架生成很多自动的功能:比如懒加载和编码过滤器。
DAO,ORM,AOP,JEE,WEB,CORE
传统装配:
1.通过set方法去装配
2.通过构造函数的参数签名去装配(提供一个持久层接口的变量)
这种方式,业务对象依赖于持久对象,一旦用户需求改变,源代码必须要修改。
手工装配量太大。
问题抛出?之前我们用工厂的方式隔离开业务层和持久层,降低了耦合性。而且我们装配的时候,如果有多个对象需要装配,这样工作量太大了。假如我们用原生的工厂装配,需要写大量的代码。
这时候,我们便可以使用spring的依赖注入。。。
依赖注入:
1.spring提供了工厂,我们只需从工厂中拿到相应的对象即可
2.不用修改源码,直接修改配置即可
<bean id=”mysqlDao” class=””>//id,相当于map中的key ,class相当于value
//工厂在读配置文件的时候,会根据id,和value,把id放入在map中,把通过反射生成的对象放入到value中。
<bean id=”userManager” class=””>
对构造方法注入
<constructor-arg ref=”userDao4Mysql”>//给构造方法注入,
使用属性的setting方法进行注入
<property name=”userDao” ref=”mysql4Dao”/>// property是一个属性,有属性名,ref是把一个bean注入到该bean中
//给该bean属性注入,就是通过ref的值从map中拿到以该值对应的对象,并通过set方法给该属性设值。调用的是Set方法,如果没有该方法就会出错
</bean>
创建bean工厂:
BeanFactory factory=new ClassPathXmlApplicationContext();
UserManager userManager=(UserManager)factory.getBean(“userManager”);//拿到的是一个接口的实现类
userManager.save();
好处:没有创建对象的过程,都是工厂自动生成相应的对象,实现了依赖注入。
spring最大的优点:自动创建对象,并且完成对象之间关系的装配
<customEditConfigurer class=””>
这是一个map,里面放置的是转换器,key对应的类型,value是转换器对象。
1.首先创建的是,
2.
装配:
如果属性的类型是整形,则在工厂中配置的是字符串类型
<property name=”intValue” value=”123”/>
就会从bean工厂中找到对象,拿到map,根据key找到属性编辑器,最后进行转化。
如果装配的是list类型
1.会创建一个ArrayList类型的对象
2.会把list里面的value数据通过add把对象的地址加入到list中(基本类型转化为包装类)
<list>
<value>list1</value>
<value>list2</value>
</list>
如果装配的是set类型的数据
<set>
<ref bean=””></ref>
</set>
如果装配的是数组类型
<list>
<value>array1</value>//会把list类型转化为String类型
</list>
如果装配的是map类型
<map>
<entry key=”k1” value=”v1”/>
<entry key=”k2” value=”v2”/>
<entry key=”k3” ref=”bean3”/>
</map>
<!--定义属性编辑器 -->
就算不配属性编辑器,工厂一创建,就会自动把属性转化器注册进工厂中
<bean
id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date" 或者 ref=”utilDataFormat”>
<!-- 将日期类型的转化器注册进map中-->
<bean class="com.bjsxt.spring.UtilDatePropertyEditor">
<property name="format" value="yyyy:MM:dd"/>
</bean>
</entry>
</map>
</property>
</bean>
<!-- 将日期类型的转化器注册进map中-->
<bean
id=”utilDataFormat” class="com.bjsxt.spring.UtilDatePropertyEditor">
<property name="format" value="yyyy:MM:dd"/>
</bean>
/*
继承一个PropertyEditsupport,并覆写setASText方法
*/
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* java.util.Date属性编辑器
* @author Administrator
*
*/
public class UtilDatePropertyEditor extends PropertyEditorSupport {
/*
*
*
*/
private String format ;
@Override
public void setAsText(String text) throws IllegalArgumentException {//一定要覆写setAsText方法,传入的text一定是个字符串类型
System.out.println("UtilDatePropertyEditor.saveAsText() -- text=" + text);
SimpleDateFormat sdf = new SimpleDateFormat(format);
try {
Date d = sdf.parse(text);
this.setValue(d);
} catch (ParseException e) {
e.printStackTrace();
}
}
public void setFormat(String format) {
this.format = format;
}
}
<property name="dateValue">
<value>2015:09:11</value>
</property>