注解开发
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);
}
}