spring的基础笔记

首先是最基础的标识组件下方4个组件功能性是一样,相当于xml文件中加了<bean> id默认为小驼峰也就是User的id就是user(可以在注解(“”)自定义id)可以自定义但是没必要!此注解常放于实现类中

@Component 这个是表示为普通组件
@Controller 这个是标识为控制层xxxController
@Repository 这个是持久层 一般是xxxDaoImpl
@Service 这个是业务层 一般是xxxServiceImpl

标识完以后需要在xml里面扫描出来其中base-package=" "这里面填上项目的路径,包含该路径的所有类都会扫描

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

其中如果有不需要扫描的组件可以通过下面的两种方式排除,第一个根据注解,第二个根据类排除

<context:exclude-filter type="annotation"  这个是根据注解的后面写上注解的全路径expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="assignable" 这个是根据类的后面写上类的全路径expression="com.lxq.spring.controller.UserController"/>

也可以通过包含某个路径的扫描,将上面的

exclude-filter 换成 include-filter

type和expression含义相同,但是这样上面的扫描器中将默认为ture的

use-default-filters="false"

设置为false,设置完以后就都不扫描了,只有下方设置的能扫描到。感觉作用不大。

接下来就是自动装配,默认是通过byType在IOC容器中类型匹配某个bean为属性赋值。 

下方就犹如:private BookDao bookDao=new BookDaoImpl();,如果有多个类型匹配的bean

就会自动转成byname,如果这报错NoUniqueBeanDefinitionException就在Autowired下面加上@Qualifier("绑定")。

@Autowired
private BookDao bookDao; BookDao是接口

接下来就是AOP的标签,先将类设置为组件在上面四个组件标签选择,然后在xml文件中扫描

<context:component-scan base-package="com.lxq.spring.aop.annotation"/>

base-package后面就是扫描的路径

然后在切面类上面加上 @Aspect  注解标识为切面

接下来在xml文件中开启注解的AOP  <aop:aspectj-autoproxy/>

在核心业务中一些非核心附加功能也就是横切关注点,横切关注点需要写发放来实现也就是‘通知’

有五种不同的通知

前置通知@Before:在被代理的目标方法前执行

返回通知@AfterReturning:在被代理的目标方法成功结束后执行

异常通知AfterThrowing:在被代理的目标方法异常结束后执行

后置通知@After:在被代理的目标方法最终结束后执行

环绕通知@Around:使用try...catch...finally结构围绕整个被代理的目标方法,包括上面四种通知对应的所有位置

顺序是前置-目标操作(核心业务)-返回or异常-后置

通知的语法是,@Pointcut注解是设置一个公共的切入点表达式

@Pointcut("execution(* com.lxq.spring.aop.annotation.CalculatorImpl.*(..))")

之后就可以直接使用这个公共表达式的方法名了,如前置通知:pointCut是上面注解下的方法名,假如改成aa,那@Before("aa()")。

@Before("pointCut()")

如果没有设置上方的公共切入点表达式每个通知就要写上面@Pointcut注解后面的表达式,那么长的代码很麻烦。

还有一点就是可以通过@order(1)注解设置优先级,越小优先级越高,默认是Integer最大值。

后面还有事务的xml配置也记录一下把,ref是下面的数据源id。下面是声明式事务的基本操作

声明式事务默认运行时异常就回滚。

<!--引入jdbc.properties-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置事务管理器-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--扫描组件-->
<context:component-scan base-package="com.lxq.spring"/>
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

配置完xml以后可以在业务层service类上加上

@Transactional 加在类上表示该类下面所有方法都开启了事务,只加在方法是表示这个方法开始了事务

如果只有’查询‘的业务可以将他设置为只读,这样数据库就可以对该业务进行优化,如果有其他增删改操作就会报错。

@Transactional(readOnly = true)

设置@Transactional(timeout= 3),3:表示3秒,如果3秒事务没执行完就会强制回滚,并且抛出异常。

设置@Transactional( noRollbackFor=ArithmeticException.class) 就是如果造成ArithmeticException异常就不回滚,后面的ArithmeticException.class就是报错的全类名。

设置@Transactional(propagation = Propagation.REQUIRES_NEW)可以设置事务的传播行为Propagation.REQUIRES_NEW表示不管当前线程上是否有已经开启 的事务,都要开启新事务。同样的场景,每次购买图书都是在buyBook()的事务中执行,因此第一本图书购买成功,事务结束,第二本图书购买失败,只在第二次的buyBook()中回滚,购买第一本图书不受影响,即能买几本就买几本。默认是@Transactional(propagation = Propagation.REQUIRED)一个事务失败就全部回滚

本人萌新第一次写笔记,如有不足还请各位老鸟指点一二!如果觉得有用可以点一波赞。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值