Spring框架使用的一些心得和理解

本文深入探讨了Spring框架的核心概念,包括IOC、AOP、事务管理和JDBC集成。详细介绍了bean的创建方式、作用域、依赖注入方法以及AOP的实现机制。同时,对Spring事务的特性和配置进行了说明,并提供了数据库集成的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IOC

传统创建类的方式 java类---->new java()
Spring方式:加载application.xml文件,ApplicationContext ap = new ClassPathXmlApplicationContext("*****");,把需要加载的bean预置到了ap容器内,使用ap.getBean(); 指定bean来创建,可以批量产生,完成对java类进行管理
在这里插入图片描述
关于其中创建的bean种类:lazy-init懒加载、scope="prototype"多例模式,种类很多,可以到官网看看

  • 配置方式:
    关于bean的创建方式:我个人常用的两种(前两个 构造注入 set注入)
构造注入
<bean id="user" class="com.ius.demo.entity.User" scope="prototype">
    <constructor-arg index="0"><value>110</value></constructor-arg>
    <constructor-arg  index="1"><value>bob</value></constructor-arg>
 </bean>
set注入  需要 user中有set方法
<bean id="user1" class="com.ius.demo.entity.User" scope="prototype">
   <property name="uid" >
   	  <value>9527</value>
   </property>
    <property name="name" >
   	  <value>唐伯虎</value>
   </property>
</bean>

比较不常用 list、set、map注入方式
<bean id="user1" class="com.ius.demo.entity.User" scope="prototype">
   <property name="uid" >
   	  <value>9527</value>
   </property>
    <property name="name" >
   	  <value>唐伯虎</value>
   </property>
   <property name="tels">
   	<array>
   		<value>110</value>
   		<value>120</value>
   		<value>122</value>
   	</array>
   </property>
   
    <property name="address">
    <list>
    	<value>沈阳1</value>
    	<value>北京2</value>
    	<value>广州1</value>
    </list>
    </property>
   
   <property name="childs">
    <set>
        <value>大毛</value>
     <value>二毛</value>
     <value>大毛</value>
    </set>
   </property>
   <property name="citys">
   <map>
   	<entry key="sy" value="沈阳"></entry>
   	<entry key="dl" value="大连"></entry>
   	<entry key="tl" value="铁岭"></entry>
   </map>
   </property>
   
   <property name="account">
   	<props>
   		<prop key="user">tom</prop>
   		<prop key="pass">123</prop>
   	</props>
   </property>
</bean>

</beans>
  • 注解方式
    导入对应jar包,在xml配置到,让spring容器去扫描注解
    <context:component-scan base-package=“com.ius”></context:component-scan>
    自动装配@Autowire、@Resource
    类上 @Component@Service、@Controller …
AOP

面向切面编程
分析一下AOP:Java是一个OOP语言,AOP就是对OOP对扩展,其实就是对原来方法的增强,但是我们有两种方式增强

  • 继承
    继承后的方法和原方法之间耦合比较多
  • 装饰模式
    常见的在IO部分,但是明显导致代码越来越负责了

所以我们比较常用AOP

一些比较官方的解释

Aspect:切面 – 封装共同业务逻辑,用该切面类实现的对象,我们称之为切面对象
JoinPoint:连接点 – 在目标类中加入共同业务的位置,在连接点中一般封装方法信息(被切入方法),表示哪些方法需要切入共同逻辑
Pointcut:切点 – 是一堆连接点的集合
Target:目标 – 目标组件,就是需要使用切面方法的依赖对象
Proxy:代理 – 被增强后的目标,即加入切面方法的目标类
Advice:通知 – 通知是一种时机,该时机其实就是一个时间点,即在哪个时候调用切面方法;包含:目标方法执行前、目标方法执行后、目标方法执行的前后、目标方法执行过程中,一定执行的、目标方法出现异常后

需要记住的是切面、切点、通知

在这里插入图片描述

关于AOP的实现方式,有JDK和cglib(导入cglib.jar)两种方式,这里了解不够多,以后会多了解

  • 设置xml配置文件
<!-- 目标类 -->
<bean id="publish" class="com.demo.Publish"></bean>
<!-- 通知类 -->
<bean id="amaAdvice" class="com.demo.AmaAdvice"></bean>

<!-- 切点+通知方法的结合 -->
<!-- 切面配置 -->
<aop:config>
   <aop:aspect ref="amaAdvice">
   <!--pointcut:目标类的某个方法 ,切点表达式:execution(切点表达式语法) -->
   		<aop:before method="redPackage10" 
   		pointcut="execution(public String com.demo.Publish.sellCY())"/>
   </aop:aspect>
</aop:config>

其中
aop:before 这样的还有四个 
<aop:before>:前置通知,在目标方法调用前
<aop:after>:最终通知,目标方法调用后,一定调用
<aop:after-returning>:后置通知,在目标方法调用后;如果目标方法出现异常,则不调用切面方法
<aop:after-throwing>:异常通知,在目标方法必须出现异常以后,调用
<aop:around>:环绕通知,在目标方法调用前后,都会调用

  • 注解的方式
    在xml中开启aop注解

aop:aspectj-autoproxy</aop:aspectj-autoproxy>

@Aspect 放在类上 认为这是一个aop有关的类

切点 @Pointcut(value=“execution(* com.**..(…))”) 放置在一个空方法上即可,类似这种,指定到方法即可
关于切点表达式总共有三种,比较常用的是execution

①bean(符合条件的对象id)
②within(符合条件的类型表达式)
within(“com.imp.StudentsDAOImp”)
③execution(方法限定表达式)
execution(int add())

@Pointcut(value="execution(* com.**.*.*(..))")
public void abc() {}

通知@Around、@After等放在切面上面

具体详细的配置实际需要使用的再进行考虑

实际开发中,通过AOP将显示在控制台上的内容,全部记录在日志文件(对某个服务器,访问一次,就会在日志文件中,记录一条)中;为了防止日志文件过大,提高存储性能,可以通过流程控制语句规定小于xx毫秒的方法不做记录,从而提高工作效率(在日志文件中只检测想要检测的数据,降低工作量。事物管理(开启事务、提交事务、回滚事务)就是AOP的经典应用,即事务管理器:底层代码通过AOP实现

  • 关于AOP的事务
  1. 首先需要了解四大特性
  1. 原子性: 不可分割的一部分,要成功都成功,要失败都失败
  2. 隔离性: A的操作,不会影响B的操作.
  3. 一致性: A操作后的结果,跟B操作后的结果一样
  4. 持久性:事务一定会把数据的改变保存下来(insert,update,delete)
  1. 五大属性

1)具有只读 readOnly select
2) 具有回滚: rollback
3) 超时特性: 可以设置超时时间.
4) 隔离属性: 处理异常情况:脏读,不可重复读,幻读问题.
5) 传播属性: 两个操作相遇时的,处理方案.

  1. 关于spring的事务(tx)
    可以进行设置事务级别

Default :依据数据库的默认值,数据库是什么级别,它就是什么级别.
ISOLATION_READ_UNCOMMITED 读未提交 读未提交,效率最高,安全最低.
ISOLATION_READ_COMMIT 读已提交数据
ISOLATION_REPEATABLE_READ 重复读,可以解决重复读,但是还有幻读
ISOLATION_SERIALIZABLE 三种问题都解决,效率低下,安全性最高,

  • 这里了解不足,日后需要补充
关于spring和jdbc

配置文件,这里使用的 JdbcTemplate,使用其它类型数据库,将org.springframework.jdbc.core.JdbcTemplate切换为使用的数据库类框架即可

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    					     destroy-method="close">
	<property name="driverClass" value="${mysql.driver}"></property>
	<property name="jdbcUrl" value="${mysql.url}"></property>
	<property name="user" value="${mysql.username}"></property>
	<property name="password" value="${mysql.password}"></property>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource"></property>
</bean>
扫描dao接口
<context:component-scan base-package="com.demo.*.dao"></context:component-scan>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值