首先是最基础的标识组件下方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)一个事务失败就全部回滚
本人萌新第一次写笔记,如有不足还请各位老鸟指点一二!如果觉得有用可以点一波赞。