spring&Junit测试&注解配置IOC和AOP以及事务

注解方式配置IOC

jar包:
![jar包][1]
引入相关配置文件
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]
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]

引入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]
配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
开启事务管理的注解
<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在使用事务的类上添加一个注解(在类上添加注解表示所有本类下的所有方法都自动开启事务和提交,出现异常回滚,单方法上添加作用只在于单方法):@Transactional

猜你喜欢

转载自blog.csdn.net/qq_40325734/article/details/80710934
今日推荐