一起学习SSM框架之spring(四)

注解开发

1.声明bean

用于替换自建类型组件的<bean..>标签,可以更快的声明bean

@Service 业务类专用
@Repository dao实现类专用
@Controller web层专用
@Component 通用
注意:前四个注解基本用法一样,下面用@Service做演示
@Scope 用户控制bean的创建模式

//@Service //<bean id="userServiceImpl" class="xx.x.x.UserServiceImpl">
@Service("userService") //<bean id="userService" class="xx.x.x.UserServiceImpl">
//@Scope("prototype")//多例
public class UserServiceImpl implements UserService{
    
    
    private UserDao userDao;

    public UserDao getUserDao() {
    
    
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
    
    
        this.userDao = userDao;
    }

    public List<User> queryUsers() {
    
    
        return userDao.queryUsers();
    }

    public void insertUser(User user) {
    
    
        userDao.insertUser(user);
    }

    public void updateUser(User user) {
    
    
        userDao.updateUser(user);
    }

    public Integer deleteUser(Integer id) {
    
    
        Integer integer=userDao.deleteUser(id);
        System.out.println(integer);
        if (1==1){
    
    
            try {
    
    
                throw new SQLException("test 事务");
            } catch (SQLException e) {
    
    
                e.printStackTrace();
                throw new RuntimeException("test 事务!!");
            }
        }
        return integer;
    }
}

2. 注入(DI)

用于完成bean中属性值的注入

@Autowired 基于类型注入
@Resource 基于名称自动注入
@Qualifier(“userDao”) 限定要自动注入的bean的id,一般和@Autowired 联用
@value 注入简单类型数据(jdk8种+String)

public class UserServiceImpl implements UserService{
    
    
    //@Autowired//类型 自动注入
    //@Resource(name="userDao")  //名称 自动注入

    //基于类型 自动注入并挑选bean id="userDao"
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    //@Value("1")
    //private Integer id;
    public UserDao getUserDao() {
    
    
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
    
    
        this.userDao = userDao;
    }

    public List<User> queryUsers() {
    
    
        return userDao.queryUsers();
    }

    public void insertUser(User user) {
    
    
        userDao.insertUser(user);
    }

    public void updateUser(User user) {
    
    
        userDao.updateUser(user);
    }

    public Integer deleteUser(Integer id) {
    
    
        Integer integer=userDao.deleteUser(id);
        System.out.println(integer);
        if (1==1){
    
    
            try {
    
    
                throw new SQLException("test 事务");
            } catch (SQLException e) {
    
    
                e.printStackTrace();
                throw new RuntimeException("test 事务!!");
            }
        }
        return integer;
    }
}

3.事务控制

用于控制事务切入

@Transactional
工厂配置中的<tx:adive …和<aop:config …可以省略

@Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,timeout = -1,readOnly = false,rollbackFor = Exception.class)
public class UserServiceImpl implements UserService{
    
    
    //@Autowired//类型 自动注入
    //@Resource(name="userDao")  //名称 自动注入

    //基于类型 自动注入并挑选bean id="userDao"
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

    //@Value("1")
    //private Integer id;
    public UserDao getUserDao() {
    
    
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
    
    
        this.userDao = userDao;
    }
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<User> queryUsers() {
    
    
        return userDao.queryUsers();
    }

    public void insertUser(User user) {
    
    
        userDao.insertUser(user);
    }

    public void updateUser(User user) {
    
    
        userDao.updateUser(user);
    }

    public Integer deleteUser(Integer id) {
    
    
        Integer integer=userDao.deleteUser(id);
        System.out.println(integer);
        if (1==1){
    
    
            try {
    
    
                throw new SQLException("test 事务");
            } catch (SQLException e) {
    
    
                e.printStackTrace();
                throw new RuntimeException("test 事务!!");
            }
        }
        return integer;
    }
}

4.注解所需配置

      <!--告知Spring注解位置-->
        <context:component-scan base-package="cn.ozl"></context:component-scan>

        <!--@Transactional-->
        <tx:annotation-driven transaction-manager="tx"></tx:annotation-driven>

5.AOP开发

5.1注解使用

@Aspect //声明此类此类是一个切面类:会包含切入点(pointcut)和通知(advice)
@Component //声明组件:进入工厂
public class MyAspect {
    
    
    //定义切入点
    @Pointcut("execution(* cn.ozl.service.UserServiceImpl.*(..))")
    public void pc(){
    
    }

    @Before("pc()") //前置通知
    public void mybefore(JoinPoint a){
    
    
        System.out.println("target"+a.getTarget());
        System.out.println("args:"+a.getArgs());
        System.out.println("method's name:"+a.getSignature().getName());
        System.out.println("before...........");
    }

    @AfterReturning(value = "pc()",returning ="ret" ) //后置通知
    public void myAfterRunning(JoinPoint a,Object ret){
    
    
        System.out.println("after.........."+ret);
    }

    @Around(value = "pc()") //环绕通知
    public Object myInterceptor(ProceedingJoinPoint p) throws Throwable {
    
    
        System.out.println("interceptor1........");
        Object ret = p.proceed();
        System.out.println("interceptor2........");
        return ret;
    }

    @AfterThrowing(value = "pc()",throwing = "ex") //异常通知
    public void myThrows(JoinPoint a,Exception ex){
    
    
        System.out.println("throws");
        System.out.println("======"+ex.getMessage());
    }
}

5.2配置

    <!--启动aop注解-->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

集成Junit

1.导入依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

2.编码

可以免去工厂创建过程
可以直接将要测试的组件注入到测试类
//测试启动。启动spring工厂,并且当前测试类也会被工厂生产
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringMyBatisTest {
    
    
    @Autowired
    @Qualifier("userService2")
    private UserService userService;

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Test
    public void testSpringJunit1(){
    
    
        List<User> users = userService.queryUsers();
        for (User user : users) {
    
    
            System.out.println(user);
        }
    }
    @Test
    public void testSpringJunit2(){
    
    
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> users = mapper.queryUsers();
        for (User user : users) {
    
    
            System.out.println(user);
        }
    }

猜你喜欢

转载自blog.csdn.net/ozl520/article/details/109136707