zoukankan      html  css  js  c++  java
  • spring&Junit测试&注解配置IOC和AOP以及事务

    注解方式配置IOC

    jar包:
    ![jar包][1]
    引入相关配置文件
    log4j.properties
    applicationContext.xml
    引入约束:
    spring-framework-4.2.4.RELEASEdocsspring-framework-referencehtmlxsd-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
  • 相关阅读:
    进程和程序
    linux socket基本知识
    window核心编程 第五章 作业
    树的基本操作(C语言)
    每天都在反省自己,但是每天却都浑浑噩噩
    Windows核心编程 内核对象
    还没完整看过一本技术的书籍啊
    管道
    Memory Layout of a C Program(7.6)
    cpio命令用法
  • 原文地址:https://www.cnblogs.com/sybk/p/10004729.html
Copyright © 2011-2022 走看看