Spring理解 - Go语言中文社区

Spring理解


         Spring是一个开源框架,Spring是于 2003 年兴起的一个轻量级的 Java 开发框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean来完成以前只可能由 EJB 完成的事情。然而, Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。 Spring 的核心是控制反转(IoC)和面向切面(AOP)

IOC: Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给 Spring,作用是实现了程序的解耦合。

DI :Dependency Injection 依赖注入.需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依赖的属性设置进去。
 

AOP:即面向切面编程,AOP 对程序进行增强:不修改源码的情况下,可以进行权限校验,日志记录,性能监控,事务控制。

      spring分为7大核心模块 https://www.cnblogs.com/xiaobaizhiqian/p/7616453.html


spring AOP底层实现原理:为容器中的管理对象生成动态代理对象

代理机制:
Spring 的 AOP 的底层用到两种代理机制:
    JDK 的动态代理 :针对实现了接口的类产生代理,没有实现接口就不能产生动态代理对象
    Cglib 的动态代理 :针对没有实现接口的类产生代理,应用的是底层的字节码增强的技术,生成当前类的子类对象。
 

 

 

Java 开发分三层架构:

WEB层:spring

业务层:bean管理

持久层:bean管理,Spring 的 JDBC 模板.ORM(对象关系映射) 模板用于整合其他的持久层框架。

 

Spring 生成 Bean 的时候几种方式:
【无参数的构造方法的方式:】
<!-- 方式一:无参数的构造方法的实例化 -->
<bean id="bean1" class="cn.itcast.spring.demo3.Bean1"></bean>
Spring 的属性注入:对象类型的注入:
<!-- 注入对象类型的属性 -->
<bean id="person" class="cn.itcast.spring.demo4.Person">
      <property name="name" value="会希"/>
      <!-- ref 属性:引用另一个 bean 的 id 或 name -->
      <property name="car2" ref="car2"/>
</bean>

Spring 的 Bean 的属性注入:

<!-- 第一种:构造方法的方式 -->
<bean id="car" class="cn.itcast.spring.demo4.Car">
      <constructor-arg name="name" value="保时捷"/>
      <constructor-arg name="price" value="1000000"/>
</bean>

<!-- 第二种: set 方法的方式 -->
<bean id="car2" class="cn.itcast.spring.demo4.Car2">
      <property name="name" value="奇瑞 QQ"/>
      <property name="price" value="40000"/>
</bean>

Spring 的分配置文件的开发

第一种:创建工厂的时候加载多个配置文件:
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
第二种:在一个配置文件中包含另一个配置文件:
<import resource="applicationContext2.xml"></import>


spring中Bean常用的注解:

@Component:组件.(作用在类上)
@Controller :WEB 层
@Service :业务层
@Repository :持久层
属性注入的注解:
@Value :用于注入普通类型.
@Autowired :自动装配:
默认按类型进行装配.
按名称注入:
@Qualifier:强制使用名称注入.
@Resource 相当于:
@Autowired 和@Qualifier 一起使用.
bean作用范围

@Scope:
singleton:单例
prototype:多例
bean的生命周期

@PostConstruct : 相当于 init-method
@PreDestroy : 相当于 destroy-method
 

AOP 的开发中的相关术语:
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入
Proxy(代理) :一个类被 AOP 织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合
 

事务的回顾:
什么是事务:

事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.


事务特性:
原子性 :强调事务的不可分割.
一致性 :事务的执行的前后数据的完整性保持一致.
隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰
持久性 :事务一旦结束,数据就持久到数据库


如果不考虑隔离性引发安全性问题:
脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.


 解决读问题:设置事务隔离级别
未提交读 :脏读,不可重复读,虚读都有可能发生
已提交读 :避免脏读。但是不可重复读和虚读有可能发生
可重复读 :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 :避免以上所有读问题.


Mysql 默认:可重复读
Oracle 默认:读已提交
 

事务的传播行为  PROPAGION_XXX
* 保证同一个事务中
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认)
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常
* 保证没有在同一个事务中
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行


<!--开启事务管理的注解:-->
<tx:annotation-driven transaction-manager="transactionManager"/>

SSM项目的注解事务:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	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-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	<!-- 事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 数据源 -->
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 传播行为 -->
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="create*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>
	<!-- 切面 -->
	<aop:config>
		<aop:advisor advice-ref="txAdvice"
			pointcut="execution(* cn.e3mall.service..*.*(..))" />
	</aop:config>
</beans>
<!-- 加载配置文件 -->
	<context:property-placeholder location="classpath:conf/*.properties" />
	<!-- 数据库连接池 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="maxActive" value="10" />
		<property name="minIdle" value="5" />
	</bean>

 

 

 

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_41987553/article/details/83048528
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 03:35:59
  • 阅读 ( 1088 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢