[关闭]
@wangyupu 2020-09-01T14:25:57.000000Z 字数 9319 阅读 28

Spring

ssm


Spring概述

  1. Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。
  2. Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 6 月首次在 Apache 2.0 许可下发布。
  3. Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。
  4. Spring 框架的核心特性是可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO 编程模型来促进良好的编程实践。
  5. Spring三大核心容器:BeansCoreContext
  6. Spring中两大核心技术,ICO(控制反转/依赖注入),AOP(面向切面编程)

引入Spring与SpringMVC的JAR

  1. <spring.version>4.0.2.RELEASE</spring.version>
  2. <!-- spring框架包 -->
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-test</artifactId>
  6. <version>${spring.version}</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-core</artifactId>
  11. <version>${spring.version}</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-oxm</artifactId>
  16. <version>${spring.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-tx</artifactId>
  21. <version>${spring.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-jdbc</artifactId>
  26. <version>${spring.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-aop</artifactId>
  31. <version>${spring.version}</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework</groupId>
  35. <artifactId>spring-context</artifactId>
  36. <version>${spring.version}</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework</groupId>
  40. <artifactId>spring-context-support</artifactId>
  41. <version>${spring.version}</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-expression</artifactId>
  46. <version>${spring.version}</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework</groupId>
  50. <artifactId>spring-orm</artifactId>
  51. <version>${spring.version}</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework</groupId>
  55. <artifactId>spring-web</artifactId>
  56. <version>${spring.version}</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>org.springframework</groupId>
  60. <artifactId>spring-webmvc</artifactId>
  61. <version>${spring.version}</version>
  62. </dependency>
  63. #控制反转(其实就是把new对象放到了配置文件里)

将组件对象的控制权从代码本身转移到外部容器
组件化的思想:分离关注点,使用接口,不再关注实现
依赖的注入:将组件的构建和使用分开

  1. #实体类
  2. public class HelloWorld {
  3. private String message;
  4. public void show(){
  5. System.out.println(message);
  6. }
  7. public void setMessage(String message) {
  8. this.message = message;
  9. }

创建xml配置文件引入头部,然后使用bean创建对象HelloWorld并参数赋值message

  1. <bean id="helloWorld" class="com.hz.pojo.HelloWorld">
  2. <property name="message" value="Hello World!"/>
  3. </bean>
  4. 注意:
  5. 相当于创建对象
  6. helloWorld = new HelloWorld();
  7. helloWorld.setMassage("Hello World!");

读取配置文件并运行

  1. //使用ClassPathXmlApplicationContext读取配置文件
  2. ApplicationContext context = new ClassPathXmlApplicationContext("spring
  3. .xml");
  4. //使用getBean("bean中ID属性值")获取对象
  5. HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
  6. helloWorld.show();

依赖注入

  1. Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象
  2. 1 .引入另一个bean(使用ref属性)

dao层

  1. public class UserDaoImpl {
  2. public void show(){
  3. System.out.println("输出UserDaoImpl信息");
  4. }

service层

  1. public class UserServiceImpl {
  2. private UserDaoImpl userDao;
  3. public void serviceShow(){
  4. userDao.show();//调用userdao.show方法
  5. }
  6. public void setUserDao(UserDaoImpl userDao) {
  7. this.userDao = userDao;
  8. }

xml配置文件

  1. <!--定义UserDaoImpl类-->
  2. <bean id="userDaoImpl" class="com.hz.dao.UserDaoImpl"></bean>
  3. <!--定义UserServiceImpl类-->
  4. <bean id="userService" class="com.hz.service.UserServiceImpl">
  5. <!--使用ref属性将userDaoImpl注入userDao-->
  6. <property name="userDao" ref="userDaoImpl"></property>
  7. </bean>

2.构造函数注入(constructor-arg)

  1. <bean id="userDao" class="dao.impl.UserDaoImpl" />
  2. <bean id="userService" class="service.impl.UserServiceImpl">
  3. <constructor-arg><ref bean="userDao" /></constructor-arg>
  4. </bean>

3.p命名空间注入属性值

引入命名空间xmlns:p="http://www.springframework.org/schema/p"

  1. 对于直接量(基本数据类型、字符串)属性:p:属性名="属性值"
  2. 对于引用Bean的属性:p:属性名-ref="Bean的id"
  1. <bean id="user" class="pojo.User" p:age="23" p:username="张三" />
  2. <bean id="userService" class="service.impl.UserServiceImpl"
  3. p:dao-ref="userDao" />

4.注入数组,字符串,集合.....各种类型

  1. private String specialCharacter1; // 特殊字符值1
  2. private String specialCharacter2; // 特殊字符值2
  3. private User innerBean; // JavaBean类型
  4. private List<String> list; // List类型
  5. private String[] array; // 数组类型
  6. private Set<String> set; // Set类型
  7. private Map<String, String> map; // Map类型
  8. private Properties props; // Properties类型
  9. private String emptyValue; // 注入空字符串值
  10. private String nullValue = "init value"; // 注入null值
  11. <bean id="entity" class="entity.TestEntity">
  12. <!-- 使用<![CDATA[]]>标记处理XML 殊字符 -->
  13. <property name="specialCharacter1">
  14. <value><![CDATA[P&G]]></value>
  15. </property>
  16. <!-- XML特殊字符替换为实体引用 -->
  17. <property name="specialCharacter2">
  18. <value>P&amp;G</value>
  19. </property>
  20. <!-- 定义内部Bean -->
  21. <property name="innerBean">
  22. <bean class="entity.User">
  23. <property name="username">
  24. <value>Mr. Inner</value>
  25. </property>
  26. </bean>
  27. </property>
  28. <!-- 注入List类型 -->
  29. <property name="list">
  30. <list>
  31. <!-- 定义List中的元素 -->
  32. <value>足球</value>
  33. <value>篮球</value>
  34. </list>
  35. </property>
  36. <!-- 注入数组类型 -->
  37. <property name="array">
  38. <list>
  39. <!-- 定义数组中的元素 -->
  40. <value>足球</value>
  41. <value>篮球</value>
  42. </list>
  43. </property>
  44. <!-- 注入Set类型 -->
  45. <property name="set">
  46. <set>
  47. <!-- 定义Set或数组中的元素 -->
  48. <value>足球</value>
  49. <value>篮球</value>
  50. </set>
  51. </property>
  52. <!-- 注入Map类型 -->
  53. <property name="map">
  54. <map>
  55. <!-- 定义Map中的键值对 -->
  56. <entry>
  57. <key>
  58. <value>football</value>
  59. </key>
  60. <value>足球</value>
  61. </entry>
  62. <entry>
  63. <key>
  64. <value>basketball</value>
  65. </key>
  66. <value>篮球</value>
  67. </entry>
  68. </map>
  69. </property>
  70. <!-- 注入Properties类型 -->
  71. <property name="props">
  72. <props>
  73. <!-- 定义Properties中的键值对 -->
  74. <prop key="football">足球</prop>
  75. <prop key="basketball">篮球</prop>
  76. </props>
  77. </property>
  78. <!-- 注入空字符串值 -->
  79. <property name="emptyValue">
  80. <value></value>
  81. </property>
  82. <!-- 注入null -->
  83. <property name="nullValue">
  84. <null/>
  85. </property>
  86. </bean>

Spring IOC常用注解

  1. @Component:实现Bean组件的定义
  2. @Repository([实例化名称]) :用于标注DAO
  3. @Service([实例化名称]) :用于标注业务类
  4. @Controller :用于标注控制器类
  5. @Autowired+@Qualifier("userDao")等价于@Resource(name = "userDao")

使用注解前需先开启注解

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xsi:schemaLocation="......
  5. http://www.springframework.org/schema/context
  6. http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  7. <!-- 扫描包中注解标注的类 -->
  8. <context:component-scan base-package="service,dao" />

Spring AOP 面向切面编程

  1. 如果说 IoC Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用。
  2. AOP Aspect Oriented Program 面向切面编程(公共功能集中解决)

AOP 当中的概念:

  1. 切入点(Pointcut): 在哪些类,哪些方法上切入(where
  2. 通知(Advice): 在方法执行的什么实际(when:方法前/方法后/方法前后)做什么(what:增强的功能)
  3. 切面(Aspect): 切面 = 切入点 + 通知,通俗点就是:在什么时机,什么地方,做什么增强!
  4. 织入(Weaving): 把切面加入到对象,并创建出代理对象的过程。(由 Spring 来完成)

五中增强方式:

  1. |目录| 说明| 使用|
  2. |---|---|---|
  3. |前置增强| 在一个方法执行之前,执行通知。| before|
  4. |后置增强| 在一个方法执行之后,不考虑其结果,执行通知。| after-returning|
  5. |最终增强| 在一个方法执行之后,只有在方法成功完成时,才能执行通知。| after|
  6. |异常增强| 在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知| after-throwing|
  7. |环绕增强| 在一个方法执行之前,执行通知。| around|
  8. 创建目标方法:

public class UserServiceImpl {
//…省略代码
public void addNewUser() {
......
}
}

  1. 创建增强处理类UserServiceLogger



org.aspectj
aspectjweaver
1.9.5

public class UserServiceLogger {
//用于打印日志信息
private static Logger log=Logger.getLogger(UserServiceLogger.class);
public void before(JoinPoint jp) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().
getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
public void afterReturning(JoinPoint jp, Object result) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().
getName() + " 方法。方法返回值:" + result);
}
}

  1. 引入xml头部

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd






pointcut-ref="pointcut">

pointcut-ref="pointcut" returning="result"/>


execution表达式匹配规则:
public * addNewUser(entity.User): “*”表示匹配所有类型的返回值。
public void (entity.User): “”表示匹配所有方法名。
public void addNewUser(..): “..”表示匹配所有参数个数和类型。
* com.service..(..):匹配com.service包下所有类的所有方法。
* com.service...(..):匹配com.service包及其子包下所有类的所有方法
*

  1. #AOP注解
  2. ##开启注解


/
* 使用注解定义切面
/
@Aspect
@Component
public class UserServiceLogger {
private static final Logger log = Logger.getLogger(UserServiceLogger.class);
@Pointcut("execution(
service.UserService.*(..))")
public void pointcut() {}
@Before("pointcut()")
public void before(JoinPoint jp) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
+ " 方法。方法入参:" + Arrays.toString(jp.getArgs()));
}
@AfterReturning(pointcut = "pointcut()", returning = "returnValue")
public void afterReturning(JoinPoint jp, Object returnValue) {
log.info("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName()
+ " 方法。方法返回值:" + returnValue);
}
}

  1. #AOP事务处理
  2. 导入txaop命名空间
  3. 定义事务管理器DataSourceTransactionManager并为其注入数据源Bean













-->


expression="execution(* com.hz.service..*.*(..))" />

  1. tx:method其他属性

timeout:事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时

read-only:事务是否为只读,默认值为false

rollback-for:设定能够触发回滚的异常类型Spring默认只在抛出runtime exception时才标识事务回滚
可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开

no-rollback-for:设定不触发回滚的异常类型
Spring默认checked Exception不会触发事务回滚
可以通过全限定类名指定不需回滚事务的异常,多个类名用英文逗号隔开

  1. #propagation事务传播机制

propagation_requierd(默认):如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

  1. #事务注解
  2. 开启注解

  1. #@Transactional注解使用

@Transactional //类中开启事务
@Service("userService")
public class UserServiceImpl{
//使用事务
@Transactional(propagation = Propagation.REQUIRED)
public boolean addNewUser(User user) {
....
}
}

Spring 能帮我们做什么

  1. ①.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。
  2. ②.Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
  3. ③.Spring 能非常简单的帮我们管理数据库事务。
  4. ④.Spring 还提供了与第三方数据访问框架(如HibernateJPA)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。
  5. ⑤.Spring 还提供与第三方Web(如Struts1/2JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
  6. ⑥.Spring 能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注