注解方式配置IOC
jar包:![![jar包][1]](https://i-blog.csdnimg.cn/blog_migrate/bb729201fc3bf3e3f465e42b105ce64f.png)
引入相关配置文件
log4j.properties
applicationContext.xml
引入约束:
spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
引入约束:(引入context的约束):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring- beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
编写相关的类:
public interface UserDao {
public void sayHello();
}
public class UserDaoImpl implements UserDao {
@Override
public void sayHello() {
System.out.println("Hello Spring...");
}
}
配置注解扫描
<!-- Spring的注解开发:组件扫描(类上注解: 可以直接使用属性注入的注解) -->
<context:component-scan base-package="com.itheima.spring.demo1"/>
在相关的类上添加注解:
@Component(value="userDao")
public class UserDaoImpl implements UserDao {
@Override
public void sayHello() {
System.out.println("Hello Spring Annotation...");
}
}
编写测试类:
@Test
public void demo2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.sayHello();
}
Spring的Bean管理的中常用的注解:
@Value :用于注入普通类型.@Autowired :自动装配:
默认按类型进行装配.
按名称注入:
@Qualifier:强制使用名称注入.
@Resource相当于:
@Autowired 和 @Qualifier 一起使用.
Bean的作用范围的注解:
@Scope :
singleton:单例
prototype:多例
Bean的生命周期的配置(初始化调用的方法和销毁调用的方法)
@PostConstruct :相当于init-method
@PreDestroy :相当于destroy-method
![![IOC注解方式.png][2]](https://i-blog.csdnimg.cn/blog_migrate/fd1e76f2a2a94b1a5f9346279a55e295.png)
XML和注解:
XML :结构清晰.
注解 :开发方便.(属性注入.)
实际开发中还有一种XML和注解整合开发:
Bean有XML配置.但是使用的属性使用注解注入.
使用AspectJ进行AOP的开发:注解的方式
spring的传统AOP的开发的包spring-aop-4.2.4.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
aspectJ的开发包:
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aspects-4.2.4.RELEASE.jar
![![AOP注解配置.png][3]](https://i-blog.csdnimg.cn/blog_migrate/0326e081e2f5a38328a7426211a5bdb8.png)
引入Spring的配置文件
引入AOP约束: <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
编写目标类:
public class ProductDao {
public void save(){
System.out.println("保存商品...");
}
public void update(){
System.out.println("修改商品...");
}
public void delete(){
System.out.println("删除商品...");
}
public void find(){
System.out.println("查询商品...");
}
}
配置目标类IOC:
<!-- 目标类============ -->
<bean id="productDao" class="cn.itcast.spring.demo4.ProductDao"></bean>
开启aop注解的自动代理:
<aop:aspectj-autoproxy/>
AspectJ的AOP的注解:
@Aspect:定义切面类的注解通知类型:
@Before :前置通知
@AfterReturing :后置通知
@Around :环绕通知
@After :最终通知
@AfterThrowing :异常抛出通知.
@Pointcut:定义切入点的注解
编写切面类(@Before(可以直接写切入点的表达式,可以写一个类名.方法)切入点的表达式就是如果调用切入点的方法aop就会执行,如果是类名.方法那就是当配置的方法中的切入点执行AOP就会执行):
@Aspect
public class MyAspectAnno {
@Before("MyAspectAnno.pointcut1()")
public void before(){
System.out.println("前置通知===========");
}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.save(..))")
private void pointcut1(){}
}
配置切面:
<!-- 配置切面类 -->
<bean id="myAspectAnno" class="cn.itcast.spring.demo4.MyAspectAnno"></bean>
其他通知的注解:
@Aspect
public class MyAspectAnno {
@Before("MyAspectAnno.pointcut1()")
public void before(){
System.out.println("前置通知===========");
}
@AfterReturning("MyAspectAnno.pointcut2()")
public void afterReturning(){
System.out.println("后置通知===========");
}
@Around("MyAspectAnno.pointcut3()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("环绕前通知==========");
Object obj = joinPoint.proceed();
System.out.println("环绕后通知==========");
return obj;
}
@AfterThrowing("MyAspectAnno.pointcut4()")
public void afterThrowing(){
System.out.println("异常抛出通知========");
}
@After("MyAspectAnno.pointcut4()")
public void after(){
System.out.println("最终通知==========");
}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.save(..))")
private void pointcut1(){}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.update(..))")
private void pointcut2(){}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.delete(..))")
private void pointcut3(){}
@Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.find(..))")
private void pointcut4(){}
}
spring注解配置junit测试
@RunWith :值为SpringJUnit4ClassRunner.class@ContextConfiguration :值为junit测试所需要的配置文件 格式classpath:路径/文件名
@Resource :测试类所需要调用的对象使用IOC注入
@Test :执行的方法
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class SpringDemo4 {
@Resource(name="accountService")
private AccountService accountService;
@Test
// 转账的测试:
public void demo1(){
accountService.transfer("会希", "凤姐", 1000d);
}
}
事务注解方式配置推荐使用
jar包![![声明式事务的注解方式jar包.png][4]](https://i-blog.csdnimg.cn/blog_migrate/8a2376a70fa97a98b749c47b82374a24.png)
配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
开启事务管理的注解
<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在使用事务的类上添加一个注解(在类上添加注解表示所有本类下的所有方法都自动开启事务和提交,出现异常回滚,单方法上添加作用只在于单方法):@Transactional