Spring框架入门详细说明

Spring

Spring快速入门

一、Spring框架配置

1入门程序编写

程序包含如下4步:

导入包spring核心容器相关包

普通java类的建立

spring配置文件

通过spring内置API接口初始化spring容器,并获取spring 容器管理的java类的实例。

 

1步:导包

导入Spring的核心包corebeanscontextexpression

spring-beans-4.3.2.RELEASE.jar

spring-context-4.3.2.RELEASE.jar

spring-core-4.3.2.RELEASE.jar

spring-expression-4.3.2.RELEASE.jar

以及commons-logging-1.2.jar日志包。

2步:配置xml

Springconfig.xml:  

配置:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans " >http://www.springframework.org/schema/beans/spring-beans.xsd">

或者,在创建xml时,选择Spring Bean Configuration File来创建,会自动写入以上代码。

 

A. 构造器方式

3步:编写相关类:

我这边起名为:Stpring.java

public Stpring(String name,int age){

  System.out.println(“name”);

System.out.println(“age”);

}

 

然后,再进入到Springconfig.xml中:

<bean id =constructor” class=”ts.Stpring.java”>

<constructor-arg index="0" value="bao" />

<constructor-arg index="1" value="18" />

constructor-arg标签:设定初始化bean的构造方法参数

index:构造方法参数位置,从0开始。

value:参数值。

spring根据constructor-arg标签判断调用哪个构造器初始化对象实例。

4步:编写测试类:

Stest.java

public class Stest {

public static void main(String[] args) {

   

//(PS: 这里Springconfig.xml我是直接配置在src下。)

也可以用包名/Springconfig.xml

   ClassPathXmlApplication cpxa = new  ClassPathXmlApplication(Springconfig.xml);

  Stpring sp = (Stpring) cxac.getBean("constructor");

}  }

运行结果:

log4j:WARN No appenders could be found for

logger (org.springframework.core.env.StandardEnvironment).

log4j:WARN Please initialize the log4j system properly.

bao

18

B. 静态工厂方式

1步:在Stpring中编写无参构造函数

public Stpring() {

System.out.println("静态工厂方式");

}

2步:配置 Springconfig.xml配置文件

<bean id="staticdao" class="factory.Factory" factory-method="getFSpr" />

3步:编写相关类 factory 包下的Factory.java

public static Stpring getFSpr(){

return new Stpring();

}

3步:测试类 Stest.java

这里只需要将getBean中的ID改掉即可。

 Stpring sp = (Stpring) cxac.getBean("staticdao");

运行结果:静态工厂方式

C. 普通工厂方式

1步:Stpring中编写方法

public void desc(){

   System.out.println("这是普通工厂方式");

}

2步:编写相关类 factory 包下的Factory.java

public Stpring getfactory(){

return new Stpring();

}

3步:配置 Springconfig.xml配置文件

 <bean id="factory" class="factory.Factory" />

<bean id="factorydao" factory-bean="factory" factory-method="getfactory" />

4步:测试 Stest.java

ClassPathXmlApplicationContext cxac =

new ClassPathXmlApplicationContext("config/springconfig.xml");

  Stpring sp = (Stpring) cxac.getBean("factorydao");

  sp.desc();

D. bean初始化和销毁方法

1步:Stpring中编写初始化和销毁方法

public void istart(){

 System.out.println("我是初始化方法");

}

public void dend(){

 System.out.println("我是销毁方法");

}

2步:配置 Springconfig.xml配置文件

<bean id="strart_destroy" class="factory.Factory"

init-method="istart" destroy-method="destroy"/>

3步:测试 Stest.java

Factory sp = (Factory) cxac.getBean("strart_destroy");

  cxac.close();   //因为需要调用销毁方法,所以这边需要调用close关闭方法。

结果:

我是初始化方法

我是销毁方法

二、Spring 基础知识

1、spring概述

1.1 Spring是什么?

Spring是一个高度灵活的轻量级框架,采用Java开发。

目的:为了解决企业级开发的复杂度。

1.2 Spring的功能介绍

提供IOC/DI(控制反转/依赖注入),可以创建对象及管理对象之间的调用关系

提供AOP(面向切面编程方式)功能

提供MVC设计模式的解决方案

提供文件上传、定时器等常用工具类。

另外,还支持myBatisStruts2Hibernat等框架。

1.3 Spring功能模块划分

 Spring框架入门详细说明

Core Container模块:

包含coreBeanscontextExpression language四个核心模块。

CoreBeans:基础模块,提供控制反转和依赖注入特性。

Context:构建在基础模块之上,ApplicationContext接口是context模块的关键。

Expression language:提供了强大的表达式语言,用于在运行时查找和操纵对象。

AOP&&Instrumentation模块:

AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。

 DataAccess模块:

JBDC: 简化了访问数据库的方式  提供了一个JDBC抽象层。

ORM对象-关系映射框架指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化的持久化支持

Transactions:支持编程和声明式的事务管理。

Web模块:

Servlet: 包含了SpringMVC(model-view-controller)设计模式。

Struts:  提供了对Struts的支持。

Test模块:

支持使用JUnittestNGSpring组件的测试。

三、Spring核心容器

IOC:控制反转。将控制权交给容器来进控制对象的创建及维护。反转:将对象的权利交给容器来进行处理。目的:获得更好的扩展性和可维护性。

IOC是通过Bean来进行控制的。

PS:代码示例: 在Spring框架配置中。

四、依赖注入  DI

依赖注入:通过web容器,动态的将依赖对象注入到另一个对象的组件中。

简单的说:就是将某些参数依赖注入到对象中。

Spring采用依赖注入方式为Bean的属性赋值。

 Spring框架入门详细说明

注入方式:手动注入和注解

1、手动注入:

Setter方法 注入方式

Spring容器中通过调用Bean对应的setter方法来完成bean属性的赋值。

根据数据的不同可分为三种情况:

基本类型注入

基本类型注入泛指:当前bean组件的属性为基本类型、基本类型的封装类型、StringStringBuffer类型

Spring组件类型注入:

8种基本类型及其封装类、String、StringBuffer

集合类型注入:

List  Set  Map 及数组

示例:

基本类型注入:

<bean id="setbasic" class="tx.Stpring" scope="prototype">

 <property name="name" value="bao"></property>

</bean>

Spring组件类型:

 <bean id="dog" class="tx.Stpring.Dog" />

 <bean id="man" class="tx.Stpring.Spring" scope="prototype">

    <property name="name" value="bao"></property>

    <property name="dog" ref="dog"></property>

 </bean>

集合类型注入:

 集合注入

  <bean id="list" class="tx.Stpring" scope="prototype">

      <property name="age">

        <list>

          <value type="int">1</value>

          <null></null>

          <value type="int">3</value>

          <value type="int">4</value>

        </list>

      </property>     

 </bean>

数组注入

 <bean id="arys" class="tx.Stpring" scope="prototype">

    <property name="array" >

        <array>

          <value>1</value>

          <value>2</value>

        </array>

    </property>

 </bean>

2、面向接口编程

面向接口编程:在程序设计或系统分析中,每个层级的程序并不是直接提供程序服务,而是定义一组接口,由接口的实现进行提供功能。面向接口编程实际上是面向对象的一部分。

1、使用注解 进行注入

Spring3.0之后,增加组件自动扫描。它可以扫描到在指定类路径下添加了@Component、@Service、@Controller和@Repository注解的类。并将扫描到的类添加到Spring管理容器中进行管理。

自动扫描配置:

1、引入AOP包

2、Springconfig.xml的NameSpaces中选中context和tx。

3、配置动态扫描

<context:component-scan base-package="tx.Stpring"></context:component-scan>

增加扫描并启动Spring容器后,Spring容器会查找在base-package目录下,配置

Spring注解的类,并加载到Spring容器中去。

使用注解配置Spring组件

@Component:泛指组件,当组件不好归类时,使用此注解

@Service: 标注业务层组件

@Controller:标注控制处组件

@Repository:标注数据访问组件,即Dao组件

若是在注解中不写value,那么Bean中的id会是首字母小写的类名称形式。

五、AOP 的核心组件

切面(Aspect):封装通用逻辑的组件,可以作用到其它组件上。

切入点(Pointcut):指定哪些组件 哪些方法使用切面组件。Spring使用表达式来实现该指定。

通知: 指定组件作用到目标组件的具体位置。

前置通知:在目标组件的方法执行前执行

public class Point {

public void cutPoint(){

System.out.println("我是切点");

}

}

public class Advice {

public void cutAdvice(){

System.out.println("我是通知哦");

}

}

<bean id="point" class="com.spring_Aop.Point" /> 

  <bean id="advicecut" class="com.spring_Aop.Advice"></bean>  

  <aop:config>

     <aop:pointcut id="pointcut" expression="execution(* com.spring_Aop.Point.*(..))" />

     <aop:aspect ref="advicecut">

         <aop:before method="cutAdvice" pointcut-ref="pointcut"/>

     </aop:aspect>

  </aop:config>

Point pointcut = (Point) cac.getBean("point");

pointcut.cutPoint();

 

后置通知:在目标组件的方法执行并返回参数后执行;有返回值情况下才执行,若不配返回类型和返回值也执行;有异常时,不执行。

 <bean id="point" class="com.spring_Aop.Point" />

 <bean id="advicecut" class="com.spring_Aop.Advice"></bean>  

  <aop:config> 

     <aop:pointcut id="pointcut" expression="execution(* com.spring_Aop.Point.*(..))" />

     <aop:aspect ref="advicecut">

         <aop:after-returning method="afterAdvice" pointcut-ref="pointcut" returning="ref"/>             

     </aop:aspect>

  </aop:config>

 Spring框架入门详细说明

异常通知:在目标组件的方法抛出异常时执行

 Spring框架入门详细说明

配置文件:

 Spring框架入门详细说明

最终通知:在目标组件执行后或在异常执行通知前 执行

 Spring框架入门详细说明

配置文件:

 Spring框架入门详细说明

环绕通知:包含前4个通知,ProceedingJoinPoint参数。

 Spring框架入门详细说明

@Resource注解:

手动注入时需要手动赋值;

@Value注解:

在属性添加注解完成注入,可以省略setter方法;只有在当前类为bean包时,才可以进行自动注入。

spring中,接口和抽象类不可以打上注解。但MVC中可以。

六、springAOP机制

切入点表达式:切面程序要作用到哪些组件的哪些函数上。

常用的切入点表达式分为:

按类匹配:使用within关键字。 定位到类中的所有方法。

按方法匹配:匹配函数作为目标函数,使用execution关键字。  常用。

beanid匹配:匹配bean中全部的函数作为目标组件。使用bean关键字

按函数匹配

完整写法

 返回类型  类的路径 类名 函数名 参数类型(用,分开)

execution(String com.chinasofti.Target.save(String))

Execution( 返回类型  类的路径 类名 函数名 参数类型(用,分开))

AOP的注解配置:

 Spring框架入门详细说明

前置通知注解方法:

@Component

@Aspect

public class Before {

@org.aspectj.lang.annotation.Before("execution(* com..*.*(..))")

public void doBefore(JoinPoint jp) {

}

}

后置通知注解方法:

@Component

@Aspect   返回值

public class After {

@AfterReturning(pointcut="execution(* com..*.*(..))",returning="ret")

public void doAfter(JoinPoint pjp,Object ret) {

System.out.println("目标程序与AOP程序执行后将最后执行,返回参数为" + ret);

}

异常通知注解方法:

@Component

@Aspect

public class ThrowException {

@AfterThrowing(pointcut="execution(* com..*.*(..))", throwing="e")

public void doThrow(JoinPoint jp , Throwable e) {

}

}

最终通知注解方法:

@Component

@Aspect

public class AfterFinally {

@After(value="execution(* com..*.*(..))")

public void afterFinally(JoinPoint jp) {

}

}

环绕通知注解方法:

@Component

@Aspect

public class Around {

@org.aspectj.lang.annotation.Around("execution(* com..*.*(..))")

public String around(ProceedingJoinPoint pjp) {

}

}

七、Spring集成工具类

Spring提供了JdbcTemple工具类,用于对jdbc的操作进行了轻量级别的封装。

优点:

直接使用sql语句操作数据库。

支持数据库的分区。

使用java语言拼sql语句。

使用spring集成jdbc包含如下几步:

导入集成包、连接池包。

初始化连接池数据源对象。

初始化JdbcTemplate对象。

调用JdbcTemplateAPI接口完成数据库操作。

导入集成包、连接池包

org.springframework.jdbc-3.0.2.RELEASE.jar

该包封装并简化了jdbc的操作,JdbcTemplate就在此包内。

连接池包

com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar    c3p0连接池。

数据库驱动包

ojdbc6.jar  /mysql-connector-java-5.1.40-bin.jar

初始化连接池数据源对象

初始化连接池数据源对象:

ComboPooledDataSource,该对象包含连接数据库的基本属性、连接池的配置属性。

初始化JdbcTemplate对象

通过spring的依赖注入设定Dao类继承的dataSource属性

<bean id="jdbcDao" class="org.springframework.jdbc.core.JdbcTemplate" >

    <property name="dataSource" ref="datasource"></property>

 </bean>

完整配置

 Spring框架入门详细说明

spring集成jdbc

//数据的增删改查

 * jdbcTemplate.update("insert into users(id,uname,password)value(?,?,?)", "1","啦啦","123");

jdbcTemplate.update("delete from users where id = ? ", 13);

jdbcTemplate.update("update users set uname=? ,password=? where id=?", "aaa","111",1);

 //查询数据

List<Users> list = jdbcTemplate.query("select * from users where id = 1", new RowMapper<Users>(){

@Override

public Users mapRow(ResultSet res, int arg1) throws SQLException {

System.out.println(arg1);

Users users = new Users();

users.setId(res.getInt("id"));

users.setUname(res.getString("uname"));

users.setPassword(res.getString("password"));

return users;

}});

   for (Users i : list) {

     System.out.println(i);

}

 

查询数据(根据uname):

Users users = jdbcTemplate.query("select * from users where uname = ?", new Object[]{"aaa"}, new ResultSetExtractor<Users>(){

@Override

public Users extractData(ResultSet reSet) throws SQLException, DataAccessException {

if(reSet.next()){

Users users = new Users();

users.setId(reSet.getInt("id"));

users.setPassword(reSet.getString("password"));

System.out.println(users);

return users;

  }

return null;

}

});

八、jdbc的事物控制

事物的四大特性:

atomic(原子性):要么都发生,要么都不发生。

consistent(一致性):数据应该不被破坏。

isolate(隔离性):用户间操作不相混淆

durable(持久性):永久保存,例如保存到数据库中等

声明式事务管理

spring的事务管理器: spring没有直接管理事务,只是开发了事物管理器调用第三方组件完成事物控制。

READ_COMMITTED允许在并发事务已经提交后读取。

REPEATABLE_READ 对相同字段的多次读取是一致的,除非数据被事务本身改变。

SERIALIZABLE完全服从ACID的隔离级别。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。

隔离级别

脏读

非重复读

幻像读

read uncommitted

允许

允许

允许

read committed

 

允许

允许

repeatable read

 

 

允许

serializable

 

 

 

 

8.1、使用Spring声明式 事物控制 分为如下几个部分:

1、配置事物控制管理器:jdbc的事物控制管理器为DataSourceTransactionManager

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="datasource"></property>

</bean>

2、配置事物通知:配置哪些函数(方法)委托spring进行事物管理,以及事物管理的隔离级别、传播行为、是否只读事物属性。

<tx:advice id="transaction" transaction-manager="transactionManager">

       <tx:attributes>

            <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>

       </tx:attributes> 

 </tx:advice>

3、配置事物的切入点:也就是spring的哪些组件要配置事物通知(建议放在service层)。

<aop:config>

          <aop:pointcut expression="execution(* com.service.*.*(..))" id="point"/>

          <aop:advisor advice-ref="transaction" pointcut-ref="point"/> 

       </aop:config>

8.2使用注解完成事物控制

1、扫描包:

<context:component-scan base-package="com.dao"></context:component-scan>

<context:component-scan base-package="com.service"></context:component-scan>

2、写一个Dao

UserDa.java 

@Component

public class UserDao {

@Autowired

JdbcTemplate jTemplate;

public int insertUser(Users user){

return jTemplate.update("insert into

 users(id,uname,password)value(?,?,?)",

user.getId(),user.getUname(),user.getPassword());

}

3、写一个Service

UserService .java

@Service

public class UserService {

@Autowired 

UserDao userdao;

public int addUser(Users user){

    return userdao.insertUser(user);

}

}

4.测试类

DataSourceTransactionManager dataSourceTransactionManager =

new DataSourceTransactionManager();

public static void main(String[] args) {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("springconfig.xml");

UserService usService = (UserService) applicationContext.getBean("userService");

usService.addUser(new Users(100,"aa","123"));

 applicationContext.close();    

}

}