spring

spring4介绍

历史
    2002年,Rod Johnson写了一本书,对以EJB为核心的Java EE平台进行批评和思考。
    2003年,Rod Johnson开发了一个框架,这就是Spring。Spring的很多设计理念,其实就是起源EJB的启发。
    当然,Spring更加简单易用。
项目中间层
    ssh: Spring Struts2 Hibernate/ssm: Spring SpringMVC MyBatis
    Spring(没有代替框架)
下载
    官方网站
        http://www.springsource.org
    下载仓库地址
        http://repo.springsource.org/libs-release-local/org/springframework/spring/
    maven
        搜索spring即可
目录介绍
    docs 
        api文档与开发指南
    libs 
        所有模块的jar包
    schema 
        xml的约束文件
使用步骤
    1.拷贝jar (20个) + common-logging-xx.jar
        libs下的jar包
    2.写appContext.xml配置文件
        docs\spring-framework-reference\index.html\Core\Configuration metadata
        拷贝xml基础配置
    3.获取Spring容器
        ClassPathXmlApplicationContext (class路径下找配置文件)
        FileSystemXmlApplicationContext (磁盘目录下找配置文件)
    4.到Spring容器中获取bean
    5.关闭Spring容器
注意
    spring4使用jdk7
    spring5使用jdk8
得到spring容器两种方式
    第一种方式
        src/appContext.xml
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");
        User user = (User)context.getBean("user");
        context.close();
    第二种方式
        src/appContext.xml
        //FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("D:\\myselfwork1\\SpringTest\\src\\appContext.xml");
        FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:appContext.xml");
        User user = (User)context.getBean("user");
        System.out.println(user);
        context.close();

spring配置详解

beans
    根元素,配置全局属性
    对所有的bean子元素起作用
    属性
        default-lazy-init 否默认延迟初始化bean
bean
    驱动类的构造器创建实例
    指定自己的相关的属性
    属性
        id 唯一标识符
        class 指定类(包名+类名)
        lazy-init 延迟初始化
        abstract 抽象类,true:Spring容器不会初始化,可以不用写class属性
    子标签
        constructor-arg 指定构造器中的参数(有参数的构造器)
        property 驱动setter方法设置参数
        constructor-arg说明
            <bean id="user" class="com.shuai.domain.User"></bean>
                调用的是无参构造public User() {}
            <bean id="user" class="com.shuai.domain.User">
                <constructor-arg><value type="java.lang.String">帅哥</value></constructor-arg>
            </bean>
                调用的是有参构造public User(String name) {}
            <bean id="user" class="com.shuai.domain.User">
                <constructor-arg><value type="java.lang.String">帅哥</value></constructor-arg>
                <constructor-arg><value type="int">20</value></constructor-arg>
            </bean>
                调用的是有参构造public User(String name, int age) {}
        property说明
            <bean id="user" class="com.shuai.domain.User">
                <property name="name"><value type="java.lang.String">帅哥</value></property>
            </bean>
                调用的是setter方法public void setName(String name) {}

IOC(控制反转) 与 DI(依赖注入)重点

IOC
    Inversion of Control
    控制反转
    对象的创建交给Spring去做.
    B类需要一个A类对象,按照惯例B类自己new一个A类对象.由B来控制A是否被创建.但是现在对象的创建交给Spring做了,那么控制关系就反过来了,称为控制反转.
DI
    Dependecy Injection
    依赖注入
    B类需要一个A类对象,只能接受Spring容器的注入.
    从容器角度来看,容器将A对象注入到B类中,就称为依赖注入

依赖注入各种类型constructor-arg/property

constructor-arg属性
    value 可以传入8种基本数据类型/基本数据类型包装类/字符串
    ref 引用容器中的bean实例
    type 数据类型
    index 在构造函数中的位置
    name 构造函数中的名字
value标签
    8种基本数据类型(byte/short/int/long/float/double/char/boolean)
        <value type="byte">1</value>
        public User(byte b) {}
    基本数据类型包装类(Byte,Short,Integer,Long,Float,Double,Character,Boolean)
        <value type="java.lang.Byte">1</value>
        public User(Byte b) {}
    字符串(String)
        <value type="java.lang.String">帅哥</value>
        public User(String b) {}
array标签
    value-type 数据类型 默认是String类型
        <array value-type="java.lang.String">
            <value>aa</value><value>bb</value>
        </array>
        public User(String[] arr) {}
list标签
    value-type 数据类型 默认是String类型
        <list value-type="java.lang.String">
            <value>a</value><value>10</value>
        </list>
        public User(List<String> list) {}
set标签
    value-type 数据类型 默认是String类型
        <set value-type="java.lang.String">
            <value>aa</value><value>bb</value>
        </set>
        public User(Set<String> set) {}
map标签
    value-type 数据类型 默认是String类型
        <map><entry key="aa" value="bb"></entry></map>
        public User(Map<String,String> map) {}
props标签
    value-type 数据类型 默认是String类型
        <props><prop key="url">xx</prop></props>
        public User(Properties prop) {}
bean标签
    <bean class="java.util.Date"/>
    public User(Date date) {}
ref标签
    引用容器中的bean实例
    <bean id="date" class="java.util.Date"/>
    <ref bean="date"/>
    public User(Date date) {}
idref标签
    引用bean的id是一个字符串
    public User(Date date) {}

配置别名

第一种方式
    <bean id="user" name="user2,user3" class=""/>
    <bean id="user" name="user2 user3" class=""/>
第二种方式
    <bean id="user" class=""/>
    <alias name="user" alias="user1"/>

导入其它配置文件

src/appContext-service.xml
<import resource="appContext-service.xml"/>

bean的作用域

singleton
    单例
    Spring容器中的实例都默认单例
prototype
    不会预初始化,每次都会创建一个新实例
request
    对应Web应用request作用域
session
    对应Web应用session作用域
application
    对应Web应用application作用域
websocket
    Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext
globalSession
    Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a Portlet context. Only valid in the context of a web-aware Spring ApplicationContext.

bean中获取Spring容器

public class User implements ApplicationContextAware{
    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {}
}

p调用属性set方法赋值命名空间

在配置文件中增加一行 xmlns:p="http://www.springframework.org/schema/p"
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="date" class="java.util.Date"/>
        <bean id="user" class="com.shuai.domain.User" 
            p:name="shuaige"
            p:date-ref="date"></bean>
    </beans>
    public class User{
        private String name;
        private Date date;
        getter/setter..
    }
注意:
    p:set方法名去掉前面的set后首字母小写=值(标量类型)

自动装配(bean的autowire属性)??????

说明
    autowire 自动装配(有4种装配方式)
    autowire-candidate 是否作为自动装配的候选者
byName
    按名称自动装配
    <bean id="idCard" class="com.shuai.domain.IdCard"/>    
    <bean id="user" class="com.shuai.domain.User" autowire="byName"/>
    public class User{
        private IdCard idCard;
        getter/setter..
    }
byType
    按类型自动装配
    <bean id="idCard" class="com.shuai.domain.IdCard" autowire-candidate="true"/>    
    <bean id="user" class="com.shuai.domain.User" autowire="byType"/>
    public class User{
        private IdCard idCard;
        getter/setter..
    }
constructor
    按构造器自动装配,按照构造器中的形参的名字来选择bean的id名
    <bean id="idCard" class="com.shuai.domain.IdCard" autowire-candidate="true"/> 
    <bean id="user" class="com.shuai.domain.User" autowire="constructor"/>
    public class User{
        private IdCard idCard;
        public User(IdCard idCard) {
            this.idCard = idCard;
        }
    }
no
    不自动装配
default

c调用构造器赋值属性命名空间

在配置文件中增加一行 xmlns:c="http://www.springframework.org/schema/c"
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:c="http://www.springframework.org/schema/c"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="date" class="java.util.Date"/>
        <bean id="user" class="com.shuai.domain.User" 
            c:_0="帅哥"
            c:_1-ref="date"></bean>
    </beans>
    public class User{
        private String name;
        private Date date;
        public User(String name,Date date){}
    }
注意:
    p:set方法名去掉前面的set后首字母小写=值(标量类型)

Bean创建的三种方式

第一种方式
    构造器方式
    <bean id="user" class="com.shuai.domain.User"></bean>
第二种方式
    调用静态工厂方法创建Bean
    <bean id="user" class="com.shuai.domain.UserFactory" factory-method="createUser"></bean>
    public class UserFactory {
        public static User createUser(){
            return new User();
        }
    }
第三种方式
    调用实例工厂方法创建Bean
    <bean id="userFactory" class="com.shuai.domain.UserFactory"></bean>
    <bean id="user" factory-bean="userFactory" factory-method="createUser"></bean>
    public class UserFactory {
        public User createUser(){
            return new User();
        }
    }

继承配置

配置文件
    <bean id="human" abstract="true" p:name="shuaige"></bean>
    <bean id="user" class="com.shuai.domain.User" parent="human"></bean>
User.java
    public class User{
        private String name;
        getter/setter..
    }
注意:
    1.会自动给User类的name属性赋值,因为父类不存在
    2.父类Bean必须是一个抽象的Bean

Bean的生命周期

第一种方式
    init-method 属性
        初始化方法,创建对象时,会主动调用此方法
        <bean id="user" class="" init-method="init"/>
        public void init(){}
    destroy-method 属性
        销毁方法,在对象销毁之前会执行此方法
        <bean id="user" class=""destroy-method="destroy"/>
        public void destroy(){}
第二种方式
    InitializingBean 接口
        初始化接口
        创建对象时,会主动调用此接口的方法
        public class User implements InitializingBean{
            @Override
            public void afterPropertiesSet() throws Exception {}
        }
    DisposableBean 接口
        销毁接口,在对象销毁之前会执行此接口的方法
        public class User implements DisposableBean{
            @Override
            public void destroy() throws Exception {}
        }

调用get方法(PropertyPathFactoryBean)

配置
    <bean id="user" class="com.shuai.domain.User" p:name="帅哥" p:age="20"></bean>
    <bean id="getUsername" class="org.springframework.beans.factory.config.PropertyPathFactoryBean" p:targetObject-ref="user" p:propertyPath="name"/>
    <bean id="getUserage" class="org.springframework.beans.factory.config.PropertyPathFactoryBean" p:targetBeanName="user" p:propertyPath="age"/>
User.java
    public class User{
        private String name;
        get/set..
    }
获取
    String name = (String)context.getBean("getUsername");
    Integer age = (Integer)context.getBean("getUserage");

调用普通方法(MethodInvokingFactoryBean)

调用无参无返回值方法
    <bean id="invokeSay" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetObject-ref="user" p:targetMethod="say"/>
调用有参无返回值方法
    <bean id="invokeSayWord" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetObject-ref="user" p:targetMethod="sayword">
        <property name="arguments"><value>hi</value></property>
    </bean>
    注意:
        1.arguments是固定的,相当于一个数组,对应方法的形参列表
        2.传值要按照顺序去传即可
调用无参又返回值
    <bean id="invokeSay" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetObject-ref="user" p:targetMethod="say"/>
    String backStr = (String)context.getBean("invokeSay");

调用静态方法(MethodInvokingFactoryBean)

调用无参无返回值静态方法
    <bean id="invokeHi" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:targetClass="com.shuai.domain.User" p:targetMethod="hi"/>
    <bean id="invokeHi" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" p:staticMethod="com.shuai.domain.User.hi"/>
带参数的同上调用普通方法

获取类中公共的静态常量(FieldRetrievingFactoryBean)

配置
    <bean id="table" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" p:staticField="com.shuai.domain.User.TABLE"/>
    <bean id="table" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" p:targetClass="com.shuai.domain.User" p:targetField="TABLE"/>
User.java
    public class User{
        public static final String TABLE = "user";
    }
调用
    String table = (String)context.getBean("table");

获取对象的属性(FieldRetrievingFactoryBean)

配置
    <bean id="user" class="com.shuai.domain.User" p:name="帅哥"></bean>
    <bean id="username" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" p:targetObject-ref="user" p:targetField="name"/>
User.java
    public class User{
        public String name;
    }
获取
    String name = (String)context.getBean("username");
注意:
    用的很少,会破坏我们的封装,不匹配POJO原则

util命名空间

说明
    IOC配置方式简化
    基于Schema简化
    引入
        添加xmlns:util="http://www.springframework.org/schema/util" ,并且引入spring-util-4.2.xsd文件
    标签
        util:constant 简化访问静态的Field
        util:property-path 简化get方法调用
        util:list 配置List集合
        util:set 配置Set集合
        util:map 配置Map集合
        util:properties 配置Properties集合
引入
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
                        http://www.springframework.org/schema/util
                        http://www.springframework.org/schema/util/spring-util-4.2.xsd"></beans>
util:constant
    <util:constant id="table" static-field="com.shuai.domain.User.TABLE"/>
    String table = (String)context.getBean("table");
util:property-path
    <bean id="user" class="com.shuai.domain.User" p:name="帅哥"></bean>
    <util:property-path id="name" path="user.name"/>
    String name = (String)context.getBean("name");
util:list
    <util:list id="list">
        <value>11</value>
        <value>22</value>
    </util:list>
    <bean id="user" class="com.shuai.domain.User" c:_0-ref="list"></bean>
    public class User {
        private List<String> list;
        public User(List<String> list) {}
    }
util:set
    <bean id="user" class="com.shuai.domain.User" c:_0-ref="set"></bean>
    <util:set id="set">
        <value>11</value>
        <value>22</value>
    </util:set>
    public class User {
        private Set<String> set;
        public User(Set<String> set) {}
    }
util:map
    <bean id="user" class="com.shuai.domain.User" c:_0-ref="map"></bean>
    <util:map id="map">
        <entry key="name" value="帅哥"></entry>
        <entry key="age" value="20"></entry>
    </util:map>
    public class User {
        private Map<String,String> map;
        public User(Map<String,String> map) {}
    }
util:properties
    <bean id="user" class="com.shuai.domain.User" c:_0-ref="prop"></bean>
    <util:properties id="prop">
        <prop key="username">root</prop>
        <prop key="password">root</prop>
    </util:properties>
    public class User {
        private Properties prop;
        public User(Properties prop) {}
    }

SpEL表达式

概述
    Spring Expression Language
    Spring表达式语言
    API
        ExpressionParser
            Spring表达式解析器 
        EvaluationContext
            Spring容器
运算表达式
    ExpressionParser parser = new SpelExpressionParser();
    //表达式
    String str = "10+10";
    //解析表达式
    Expression expression = parser.parseExpression(str);
    //得到结果
    Object value = expression.getValue();
    int value1 = expression.getValue(Integer.class);
字符串
    String str = parser.parseExpression("Spring").getValue(String.class);
字符串长度
    Object strlength = parser.parseExpression("'Spring'.bytes.length").getValue();
定义数组
    String[] arr = (String[])parser.parseExpression("new String[]{'Spring','mybatis'}").getValue();
定义List集合
    List<Object> list = (List<Object>)parser.parseExpression("{'spring',100}").getValue();
定义Map集合
    Map<Object,Object> map = (Map<Object,Object>)parser.parseExpression("{'1':'shuaige,'2':20}").getValue();
调用类的静态方法
    parser.parseExpression("T(java.lang.Math).random()").getValue();
    parser.parseExpression("T(java.lang.System).out.println('shuaige')").getValue();
创建类的对象,并且放入容器
    ExpressionParser parser = new SpelExpressionParser();
    EvaluationContext context = new StandardEvaluationContext();
    Object date = parser.parseExpression("new java.util.Date()").getValue();
    context.setVariable("date", date);
    Object longTime = parser.parseExpression("date.getTime()").getValue(context);
集合内数据操作
    迭代
        ExpressionParser parser = new SpelExpressionParser();
        EvaluationContext context = new StandardEvaluationContext();
        context.setVariable("list", parser.parseExpression("{'SpringMvc','Spring','Hibernate'}").getValue());
        parser.parseExpression("list.?[length()>6]").getValue(context);
    字符串长度
        ExpressionParser parser = new SpelExpressionParser();
        EvaluationContext context = new StandardEvaluationContext();
        context.setVariable("list", parser.parseExpression("{'SpringMvc','Spring','Hibernate'}").getValue());
        parser.parseExpression("#list.![length()]").getValue(context);
配置文件中使用
    List集合
        <bean id="user" class="com.shuai.domain.User" p:list="#{{'springmvc','spring'}}" />
    set集合
        <bean id="user" class="com.shuai.domain.User" p:set="#{{20,30}}" />
    map集合
        <bean id="user" class="com.shuai.domain.User" p:map="#{{'name':'帅哥','age':20}}" />
    properties
        <bean id="user" class="com.shuai.domain.User" p:prop="#{{'city':'广州','name':'帅哥'}}" />
    数组
        <bean id="user" class="com.shuai.domain.User" p:arr="#{new String[]{'spring','hibernate'}}" />
    对象
        <bean id="user" class="com.shuai.domain.User" p:date="#{new java.util.Date()}" />
    调用静态方法赋值
        <bean id="user" class="com.shuai.domain.User" p:result="#{T(com.shuai.domain.ResultUtil).sum(10,20)}" />

Spring资源访问

第一种方式:配置文件
    单个文件
        文件
            src/db.properties
        配置
            <bean id="user" class="com.shuai.domain.User" p:resource="classpath:db.properties"/>
        User.java
            public class User {
                private Resource resource;
                get/set..
            }
    多个文件
        文件
            src/db.properties 和 src/log.properties
        配置
            <bean id="user" class="com.shuai.domain.User" p:resources="#{new Object[]{'classpath:db.properties','classpath:log.properties'}}"/>
        User.java
            public class User {
                private Resource[] resources;
            }
第二种方式:代码
    文件
        src/db.properties
    代码
        Resource resource = new ClassPathResource("db.properties");
        Resource resource = new FileSystemResource("D:\\workspace\\SpringTest\\src\\db.properties");

加载配置文件

属性占位符#{}
    第一种方式(PropertySourcesPlaceholderConfigurer):
        文件
            src/db.properties(name=root)
        配置
            <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" p:location="classpath:db.properties"></bean>
            <bean id="user" class="com.shuai.domain.User" p:name="${name}"></bean>
        User.java
            public class User {
                private String name;
                get/set..
            }
        多文件配置
            <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" p:locations="#{new Object[]{'classpath:db.properties','classpath:log.properties'}}"/>
    第二种方式(配置)
        配置中添加一行 xmlns:context="http://www.springframework.org/schema/context"
            <beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:context="http://www.springframework.org/schema/context"
                xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.2.xsd"></beans>
        使用标签
            <context:property-placeholder location="classpath:log.properties"/>
            <context:property-placeholder location="classpath:db.properties,classpath:log.properties"/>
属性重写
    第一种方式
        文件
            src/db.properties(user.name=root)
        配置
            <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer" p:location="classpath:db.properties"></bean>
        User.java
            public class User {
                private String name;
                get/set..
            }
        多文件配置
            <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer" p:locations="#{new Object[]{'classpath:db.properties','classpath:log.properties'}}"></bean>
    第二种方式
        配置中添加一行 xmlns:context="http://www.springframework.org/schema/context"
            <beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:context="http://www.springframework.org/schema/context"
                xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.2.xsd"></beans>
        使用标签
            <context:property-override location="classpath:db.properties"/>
            <context:property-override location="classpath:db.properties,classpath:log.properties"/>

Spring零配置(注解)

@Component 普通组件
@Controller 控制器组件
@Service 业务组件
@Repository 仓储(数据访问)
@Resource 配置依赖注入
@Autowired/@Qualifier 
@Scope 指定Bean的作用域
@Lazy 延迟初始化
@PostConstruct/@PreDestroy 生命周期
开启注解扫描
    <context:component-scan base-package=""></context:component-scan>
    扫面所有的 @Component/@Controller/@Service/@Repository 创建实例交给Spring容器管理

AOP

Spring+struts2

spring4.3.9+struts2.5.13
    1.拷贝Struts2的jar
        struts-2.5.13\apps\struts2-showcase\lib目录下的所有jar包
        注意:去掉spring的jar包
    2.Web应用整合Struts2
        <filter>
            <filter-name>struts-prepare</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareFilter</filter-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>struts-default.xml,struts-plugin.xml,struts.xml,struts1.xml</param-value>
            </init-param>
        </filter>
         <filter-mapping>
            <filter-name>struts-prepare</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        <filter>
            <filter-name>struts-execute</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class>
        </filter>
         <filter-mapping>
            <filter-name>struts-execute</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        注意:去掉一些自己不需要的配置
    3.Web应用整合Spring4(Spring容器的创建).
        默认是WEB-INF目录/WEB-INF/applicationContext*.xml 或者 applicationContext*.xml(src目录)
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext*.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    4.Struts2整合Spring4:
        拷贝struts-spring-plugin-xxx.jar 由struts提供,因为Spring这个框架出现的时间比Struts2晚
        作用:把action类的实例创建交给Spring创建,创建好后就会按byName为action实例中的set方法注入值.注入完成后,Spring再把action实例归还给Struts2.
    5.配置struts配置文件和spring配置文件

spring+hibernate

spring4.3.9+hibernate4.3.11
    1.拷贝hibernate的jar包
        jpa+required+optional/c3p0+mysql-connector-java-5.1.27.jar
    2.创建hibernate.cfg.xml
        <session-factory>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
            <property name="hibfernate.show_sql">true</property>     
            <property name="hibernate.format_sql">true</property>   
            <property name="hibernate.hbm2ddl.auto">update</property>
            <mapping class="com.shuai.domain.User"/>
        </session-factory>
    3.创建src/db.properties
    4.拷贝Springjar包
        20个 + commons-logging-xx.jar + aop依赖的aspectjweaver.jar
    5.创建Spring的配置文件applicationContext.xml
        <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:p="http://www.springframework.org/schema/p"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xmlns:aop="http://www.springframework.org/schema/aop"
            xmlns:context="http://www.springframework.org/schema/context"
            xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-3.0.xsd"
                default-autowire="byName"></beans>
    6.配置applicationContext.xml
        6.0注意:一定在beans加一个属性 default-autowire="byName"
        6.1加载db.properties
            <context:property-placeholder location="classpath:db.properties"/>
        6.2创建数据库连接池
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
                p:driverClass="${driverClass}"
                p:jdbcUrl="${jdbcUrl}"
                p:user="${user}"
                p:password="${password}"
                p:maxPoolSize="${maxPoolSize}"
                p:minPoolSize="${minPoolSize}"
                p:initialPoolSize="${initialPoolSize}"/>
        6.3创建数据库数据源
            <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
                p:dataSource-ref="dataSource"
                p:configLocation="classpath:hibernate.cfg.xml"/>
        6.4配置aop切面
            <!-- 事务管理器-->
            <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
                p:sessionFactory-ref="sessionFactory"/> 
            <!-- 配置事务切面bean(声明式事务配置) -->
            <tx:advice id="txAdvice" transaction-manager="transactionManager">
                <tx:attributes>
                    <tx:method name="set*" read-only="true"/>
                    <tx:method name="get*" read-only="true"/>
                    <tx:method name="*" read-only="false"/>
                </tx:attributes>
            </tx:advice>
            <!-- 事务切面(运用到哪些切入点) -->
            <aop:config>
                <aop:pointcut expression="execution(* com.shuai.service.*.*(..))" id="pointcut"/>
                <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
            </aop:config>
    7.代码
        HibernateDao.java
            public interface HibernateDao {
                <T> void save(T entity);
                <T> void update(T entity);
                <T> T get(Class<?> clazz, Serializable id);
                <T> void delete(T entity);
                <T> List<T> find(String hql);
            }
        HibernateDaoImpl.java
            public class HibernateDaoImpl extends HibernateDaoSupport implements HibernateDao {
                @Override
                public <T> void save(T entity) {
                    this.getHibernateTemplate().save(entity);
                }
                @Override
                public <T> void update(T entity) {
                    this.getHibernateTemplate().update(entity);
                }
                @Override
                public <T> T get(Class<?> clazz, Serializable id) {
                    return (T)this.getHibernateTemplate().get(clazz, id);
                }
                @Override
                public <T> void delete(T entity) {
                    this.getHibernateTemplate().delete(entity);
                }
                @Override
                public <T> List<T> find(String hql) {
                    return (List<T>)this.getHibernateTemplate().find(hql);
                }
            }
        

spring+mybatis

spring4.3.9+mybatis3.4.4
    1.拷贝mybatis3的jar包
        mybatis-3.4.4.jar+mybatis-spring-1.3.1.jar+mysql-connector-java-5.1.27.jar+c3p0-0.9.5.2.jar+mchange-commons-java-0.2.11.jar
    2.编写src/db.properties
    3.编写src/mybatis-config.xml
        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE configuration
          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
            <typeAliases>
                <typeAlias type="com.shuai.domain.User" alias="User" />
            </typeAliases>
        </configuration>
    4.拷贝spring的jar包
        20个+common-logging-xx.jar
    5.配置applicationContext.xml
        5.1注意:beans中不能配置 default-autowire="byName"
        5.2加载数据库配置文件
            <context:property-placeholder location="classpath:db.properties"/>
        5.3创建数据源
            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
                p:driverClass="${driverClass}"
                p:jdbcUrl="${jdbcUrl}"
                p:user="${user}"
                p:password="${password}"
                p:maxPoolSize="${maxPoolSize}"
                p:minPoolSize="${minPoolSize}"
                p:initialPoolSize="${initialPoolSize}"/>
        5.4创建session工厂
            <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
                p:dataSource-ref="dataSource" p:configLocation="classpath:mybatis-config.xml" p:mapperLocations="classpath:com/shuai/domain/*.xml"/>
        5.5加载mybatis配置文件
            <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
                p:basePackage="com.shuai.dao" p:sqlSessionFactoryBeanName="sqlSessionFactory"/>
        5.6配置事务
            <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
                p:dataSource-ref="dataSource"/>
            <tx:advice id="txAdvice">
                <tx:attributes>
                    <tx:method name="set*" read-only="true"/>
                    <tx:method name="get*" read-only="true"/>
                    <tx:method name="*" read-only="false"/>
                </tx:attributes>
            </tx:advice>
            <aop:config>
                <aop:pointcut expression="execution(* com.shuai.service.*.*(..))" id="pointcut"/>
                <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
            </aop:config>
    6.代码
        UserDao.java
            public interface UserDao {
                void insert(User user);
            }
        User.xml
            <mapper namespace="com.shuai.dao.UserDao">
                <insert id="insert" parameterType="User">
                    insert into user (name) values (#{name})
                </insert>
            </mapper>

springmvc+spring

spring+log4j

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容