Spring基础--Spring(你必须要懂得基础)

1_Spring概述

作者: 风离紫竹--tryzq521@126.com



2_IOC

作者: 风离紫竹--tryzq521@126.com
1.IOC概述
①含义:Iversion of Control反转控制——反转资源获取的方向
②传统的获取资源的方式
组件向当前所在的环境主动的去要资源
ActionContext.getContext().getSession();

③IOC提倡的方式
由组件所在的环境负责将资源注入到组件中,组件被动接受即可
SessionAware接口→setSession()

④IOC是一种思想,最经典的实现是DI:Dependency Injection依赖注入

2.IOC容器细节
①使用IOC容器创建对象
②使用IOC容器在创建对象的同时,给对象的属性赋值
③在创建对象的过程中,实现组件对象之间的自动装配

3.搭建Spring IOC容器需要的开发环境
①导入IOC容器需要的jar包
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar

②创建Spring配置文件:Spring Bean Configuration File

4.IOC容器创建对象
①IOC容器本身对象创建时,会将配置文件中配置好的bean创建出来
②默认是单实例的,只创建bean的一个对象
③如果设置bean的scope属性为prototype,那么创建bean的对象就是多实例的,在获取的时候创建,每次获取对象都会创建新的

5.从IOC容器中获取对象
①根据bean的id获取
②根据bean的类型获取:要求容器中指定类型的bean是唯一的

6.bean的后置处理器
①在bean的 初始化方法调用前后执行操作的专门的对象
②自定义后置处理器:org.springframework.beans.factory.config.BeanPostProcessor

7.属性的装配
①手动装配
②自动装配

8.使用注解配置bean
①声明bean的注解
@Component 将当前类声明为IOC容器中的一个普通的组件

@Controller 将当前类声明为IOC容器中的一个控制器组件

@Service 将当前类声明为IOC容器中的业务逻辑层组件

@Repository 将当前类声明为IOC容器中的一个持久化层组件

Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。
②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar
③需要设置自动扫描的包
< context:component-scan base-package = "com.atguigu.ioc.bean" />
④使用注解后,默认按照类名首字母小写作为id的值,也可以使用value属性指定id,value属性名也可以省略
注解 id值
@Component
public class CommonComponent{

}
commonComponent
@Controller (value= "atguiguBookAction" )
public class BookAction {

}
atguiguBookAction
@Service ( "happyService" )
public class BookService {

}
happyService
⑤使用注解进行自动装配:@Autowired注解
[1]首先检测标记了@Autowired注解的属性的类型
[2]根据类型进行装配
[3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean
[4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id
[5]如果设置@Autowired注解的required属性为false,则不勉强装配属性,如果能够装配则装配,如果不能装配则不装配。

9.泛型依赖注入





3_IOC补充

作者: 风离紫竹--tryzq521@126.com
使用@Scope注解可将bean声明为多实例的
@Scope (value= "prototype" )


4_AOP

作者: 风离紫竹--tryzq521@126.com
1.概念:Aspect Oriented Programming 面向切面编程

2.作用:本质上来说是一种简化代码的方式
  • 继承机制
  • 封装方法
  • 动态代理
  • ……

3.情景举例
①数学计算器接口
int add(int i,int j);
int sub(int i,int j);
int mul(int i, int j);
int div(int i,int j);
②提供简单实现
③在简单实现的基础上让每一个计算方法都能够打印日志
④缺陷
[1]手动添加日志繁琐,重复
[2]统一修改不便
[3]对目标方法本来要实现的核心功能有干扰,使程序代码很臃肿,不易于开发维护
⑤使用动态代理实现
[1]创建一个类,让这个类能够提供一个目标对象的代理对象
[2]在代理对象中打印日志

4.AOP术语


5.在Spring中使用AOP实现日志功能
①Spring中可以使用注解或XML文件配置的方式实现AOP。
②导入jar包
  com.springsource.net.sf.cglib -2.2.0.jar
  com.springsource.org.aopalliance-1.0.0 .jar
  com.springsource.org.aspectj.weaver-1.6.8 .RELEASE.jar
  commons-logging-1.1.3. jar
  spring-aop-4.0.0.RELEASE.jar
  spring-aspects-4.0.0.RELEASE.jar
  spring-beans-4.0.0.RELEASE.jar
  spring-context-4.0.0.RELEASE.jar
  spring-core-4.0.0.RELEASE.jar
  spring-expression-4.0.0.RELEASE. jar

③开启基于注解的AOP功能
< aop:aspectj-autoproxy />

④声明一个切面类,并把这个切面类加入到IOC容器中
@Aspect //表示这是一个切面类
@Component //加入IOC容器
public class LogAspect {

}

⑤在切面类中声明通知方法
[1]前置通知:@Before
[2]返回通知:@AfterReturning
[3]异常通知:@AfterThrowing
[4]后置通知:@After
[5]环绕通知:@Around

⑥被代理的对象也需要加入IOC容器

6.切入点表达式
①最详细
execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))
②最模糊
execution(* *.*(..))

7.统一声明切入点表达式
      @Pointcut (value= "execution(public int com.atguigu.aop.target.EazyImpl.add(int,int))" )
      public void myPointCut(){}

8.通知方法的细节
①在前置通知中获取目标方法的方法名和参数列表
[1]在通知方法中声明一个JoinPoint类型的形参
[2]调用JoinPoint对象的getSignature()方法获取目标方法的签名
[3]调用JoinPoint对象的getArgs()方法获取目标方法的实际参数列表
②在返回通知中获取方法的返回值
[1]在@AfterReturning注解中添加returning属性
@AfterReturning (value= "myPointCut()" ,returning= "result" )

[2]在返回通知的通知方法中声明一个形参,形参名和returning属性的值一致
showReturnLog(JoinPoint joinPoint, Objectresult)
③在异常通知中获取异常对象
[1]在@ AfterThrowing注解中添加throwing属性
@AfterThrowing (value= "myPointCut()" ,throwing= "throwable" )
[2]在异常通知的通知方法中声明一个形参,形参名和throwing属性值一致
showExceptinLog(JoinPoint joinPoint, Throwablethrowable)

9.真正放在IOC容器中的对象是代理对象,而并不是目标对象本身

10.切面的优先级
对于同一个代理对象,可以同时有多个切面共同对它进行代理。
可以通过@Order (value=50)注解来进行设置,值越小优先级越高

5_JdbcTemplate

作者: 风离紫竹--tryzq521@126.com
1.Spring提供的一个操作数据库的技术,是对Jdbc的封装。语法风格非常接近DBUtils。

2.配置环境
①导入jar包
[1]IOC容器需要的jar包
[2]MySQL驱动、C3P0jar包
[3]JdbcTemplate需要的jar包
②在IOC容器中配置数据源
③在IOC容器中配置JdbcTemplate对象的bean,并将数据源对象装配到JdbcTemplate对象中

6_声明式事务

作者: 风离紫竹--tryzq521@126.com
1.编程式事务
//1.获取Connection对象
Connection conn = JDBCUtils.getConnection();

try {
//2.开启事务:取消自动提交
conn.setAutoCommit(false);

//3.执行数据库操作
chain.doFilter(req,resp);

//4.提交事务
conn.commit();

}catch(Exception e) {

//5.回滚事务
conn.rollBack();

}finally{

//6.释放资源

}

2.声明式事务
①基本原理:AOP
[1]前置通知:开启事务
[2]返回通知:提交事务
[3]异常通知:回滚事务
[4]后置通知:释放资源
②事务管理器



③导入jar包
[1]IOC容器需要的jar包
[2]AOP需要的jar包
[3]JdbcTemplate操作需要的jar包
[5]MySQL驱动和C3P0

④配置
[1]配置数据源
[2]配置JdbcTemplate,并装配数据源
[3]配置事务管理器,并装配数据源
      < bean id = "dataSourceTransactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
           < property name = "dataSource" ref = "dataSource" />
      </ bean >

[4]开启基于注解的声明式事务功能
< tx:annotation-driven transaction-manager = "dataSourceTransactionManager" />
如果事务管理器的bean的id正好是transaction-manager的默认值transactionManager,则可以省略

[5]在事务方法上加@Transactional注解

3.情景举例
①导入SQL文件:declaration_transaction.sql
②数据库操作
[1]根据isbn的值查询书的价格
[2]根据isbn的值减少书的库存,假设每次都只买1本书
[3]根据用户名减少用户账户中的余额,减少的额度就是书的价格

4.事务属性的设置
①事务的传播行为
[1]一个事务运行在另一个有事务的方法中,那么当前方法是开启新事务还是在原有的事务中运行。
[2]设置事务方法在调用其他事务方法时,自己的事务如何传播给被调用的方法。
[3]设置方式
@Transactional (propagation=Propagation. REQUIRES_NEW )

②事务的隔离级别
isolation=Isolation. READ_COMMITTED

③事务根据什么异常不进行回滚
noRollbackFor=ArithmeticException. class

④事务的超时属性
[1]数据库事务在执行过程中,会占用数据库资源,所以如果某一个事务执行的时间太长,那么就会导致资源被长时间占用,影响其他事务执行。
[2]可以通过设置超时属性,将超时没有执行完的事务回滚。
timeout=3

⑤事务的只读属性
数据库会对事务进行优化,如果是一个查询操作,那么数据库可以有针对性的进行优化。我们可以通过设置事务属性,告诉数据库当前操作是一个只读操作,便于数据库进行优化。
readOnly= true

5.基于XML的声明式事务
      <!-- 配置基于XML的声明式事务 -->
      <!-- 声明切入点表达式 -->
      < aop:config >
           < aop:pointcut expression = "execution(* com.atguigu.tx.component.BookService.doCash(String, String))"
                          id = "txPointCut" />
           <!-- 将事务切入点和事务建议的配置关联起来 -->
           < aop:advisor advice-ref = "bookTransaction" pointcut-ref = "txPointCut" />
      </ aop:config >
     
      <!-- 设置事务属性 -->
      < tx:advice id = "bookTransaction" transaction-manager = "dataSourceTransactionManager" >
           < tx:attributes >
               < tx:method name = "doCash"
                           propagation = "REQUIRED"
                           isolation = "READ_COMMITTED"
                           read-only = "false"
                           no-rollback-for = "java.lang.ArithmeticException"
                           timeout = "3"
                           />
                          
               <!-- 将某一类方法统一设置为只读 -->
               < tx:method name = "get*" read-only = "true" />
               < tx:method name = "find*" read-only = "true" />
               < tx:method name = "query*" read-only = "true" />
           </ tx:attributes >
      </ tx:advice >

7_整合Hibernate

作者: 风离紫竹--tryzq521@126.com
1.整合目标




3.Spring为SessionFactory接口提供了一个可以被配置为bean的实现类:org.springframework.orm.hibernate4.LocalSessionFactoryBean

4.事务管理器:org.springframework.orm.hibernate4.HibernateTransactionManager

5.在Dao中获取Session对象
①factory .openSession()
开启新的会话,返回一个新创建的Session对象

②factory .getCurrentSession()
从当前线程上获取Session对象,保证多个数据库操作在同一个事务中
注意:在Spring和Hibernate整合环境下,当前方法必须运行在声明式事务中才能够通过getCurrentSession()获取到Session对象。
public Session getSession() {
     
      //测试Dao的方法时,使用openSession()
      return factory .openSession();
     
      //运行在事务方法中时,使用getCurrentSession()
      //return factory.getCurrentSession();
}

8_整合Struts2

作者: 风离紫竹--tryzq521@126.com
1.在Web应用中使用Spring
①创建IOC容器对象
②Web应用工作阶段:初始化阶段→请求响应阶段→卸载前清理
③在Web应用初始化阶段将IOC容器对象创建出来,并保存到application域中。
④在ServletContextListener监听器中执行如下操作
[1]创建IOC容器对象
[2]将IOC容器对象保存到application域中

2.整合Struts2
①导入jar包
[1]Spring需要的jar包
IOC容器需要的jar包
Web应用相关的jar包
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

[2]Struts2需要的jar包
[3]Struts2提供的一个用于整合Spring的插件jar包
LibrarySupport\struts-2.3.15.3\lib
struts2-spring-plugin-2.3.15.3.jar

②配置Spring提供的一个专门用于创建IOC容器对象的监听器
      <!-- 配置Web应用的初始化参数,指定Spring配置文件的位置 -->
      < context-param >
           < param-name > contextConfigLocation </ param-name >
           < param-value > classpath:applicationContext.xml </ param-value >
      </ context-param >

      <!-- 配置加载IOC容器的监听器 -->
      < listener >
           < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
      </ listener >
③导入Struts2自身的配置文件,配置核心Filter
④将Struts2的Action类设置为多实例方式创建
@Scope (value= "prototype" )
⑤Struts2整合Spring后,Action类的对象交给IOC容器创建,那么在class属性中,就可以使用Action类的bean的id




















9_CRUD练习

作者: 风离紫竹--tryzq521@126.com
1.功能描述
[1]显示员工列表,要求显示员工列表时显示部门名称
[2]添加员工,在添加界面显示所有部门列表,供选择
[3]更新员工,在更新界面显示所有部门列表,供选择,并且初始状态下显示当前员工现在的部门
[4]删除员工
[5]以上所有增删改操作执行完成后都回到列表页面

2.项目结构
①实体类
Employee
Department
②组件
持久化层:HibernateDao/HibernateDaoImpl
Tips:在使用openSession()方式单独测试Dao方法时,update()和delete()方法需要工作在事务中才有效
业务逻辑层:EmployeeService/EmployeeServiceImpl
表示层:EmployeeAction



③页面
index.jsp:显示“前往员工列表”超链接
showEmpList.jsp:显示员工列表
addUI.jsp:显示添加员工信息的表单界面
editUI.jsp:显示编辑员工信息的表单界面
④配置文件
Spring配置文件
Hibernate配置文件:cfg/hbm
Struts2配置文件
web.xml配置文件
jdbc.properties属性文件
★配置文件可以专门创建一个Source Folder来保存,源码目录中的内容经过项目编译后会被保存到类路径下
⑤jar包
[1]MySQL和数据库连接池
[2]Spring
IOC容器
AOP
jdbc
web
[3]Hibernate
[4]Struts2:整合Spring时需要用到的插件

3.实现步骤
①创建数据库:ssh_crud0917
②导入所需要的jar包
③使用Spring的IOC容器创建数据源对象

4.OpenSessionInViewFilter
作用:将Hibernate的Session的开启时间延长到JSP页面执行完成。
配置
      <!-- 配置OpenSessionInViewFilter -->
      < filter >
           < filter-name > OpenSessionInView </ filter-name >
           < filter-class > org.springframework.orm.hibernate4.support.OpenSessionInViewFilter </ filter-class >
      </ filter >
      < filter-mapping >
           < filter-name > OpenSessionInView </ filter-name >
           < url-pattern > /* </ url-pattern >
      </ filter-mapping >

5.配置使用二级缓存
①导入二级缓存jar包
hibernate-release-4.2.4.Final\lib\optional\ehcache\全部
②导入二级缓存自身的配置文件
hibernate-release-4.2.4.Final\project\etc\ehcache.xml
③在Hibernate中开启二级缓存功能
④配置Department类开启二级缓存功能
⑤开启查询缓存功能
⑥让Query对象setCacheable(true)




  • 12
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值