Spring-IOC、AOP、事务的说明

今天来聊一聊我对spring 核心功能的认识,本篇章中不详细讲解具体的使用方法和实现

一、spring是什么?

spring 是一个java语言下的bean管理的基础框架。

二、spring的常用功能有那些,分别解决了那些问题?

  1. IOC

    ​ IOC容器帮我们解决了bean对象的管理繁琐问题,例如:对象的创建、对象之间的相互依赖、对象的销毁等相关问题。为了更好的体现spring的便利性,下面来看两段代码对bean对象的操作与管理。

    //第一种,自己管理bean对象,实现了两层逻辑dao层和service层,分别需要自行创建对象和设置相应的属性值,当有更多的对象和对象间的相互引用时代码会更难管理和维护;可以之间看main方法,创建的对象和属性填充;
    
    public interface UserDao {User get(Long userId);}
    
    public class UserDaoImpl implements UserDao {
    	@Override
    	public User get(Long userId) {
    		if (Objects.equals(1, userId)) {
    			User user = new User();
    			user.setUserId(1L);
    			user.setUserName("zhangsan");
    			return user;
    		}
    		return null;
    	}
    }
    
    public interface UserService {User get(Long userId);}
    
    public class UserServiceImpl implements UserService {
    	private UserDao userDao;
    	@Override
    	public User get(Long userId) {return userDao.get(userId);}
    	public UserDao getUserDao() {return userDao;}
    	public void setUserDao(UserDao userDao) {this.userDao = userDao;}
    }
    
    public class Main {
    	public static void main(String[] args) {
            //创建dao对象
    		UserDao userDao = new UserDaoImpl();
            //创建service对象
    		UserServiceImpl userService = new UserServiceImpl();
            //填充service的dao属性
    		userService.setUserDao(userDao);
            //如果我们有更多的对象需要创建,需要对更多属性进行赋值时要怎么处理? 创建好的对象在哪里维护管理?
    		User user = userService.get(1L);
    		System.out.println(user);
             userService = null;
    		userDao = null;
    	}
    }
    
    //第二种使用spring对bean进行管理,相同的代码添加几个简单的注解既可以实现,注意下方带1,2,3的注释行,1,2两个注解的本质都是使用@Component对类进行标注,spring容器启动时对代码进行扫描并检查@Component注解实现对bean Definition信息的生成,在main方法中调用getBean方法时,spring通过bean  Defintion信息创建对象,并根据@Autowired注解进行属性的注入,从而把dao对象填充到service中。
    
    public interface UserDao {User get(Long userId);}
    
    @Repository //1
    public class UserDaoImpl implements UserDao {
    	@Override
    	public User get(Long userId) {
    		if (Objects.equals(1, userId)) {
    			User user = new User();
    			user.setUserId(1L);
    			user.setUserName("zhangsan");
    			return user;
    		}
    		return null;
    	}
    }
    
    public interface UserService {User get(Long userId);}
    
    @Service //2
    public class UserServiceImpl implements UserService {
    	private UserDao userDao;
    	@Override
    	public User get(Long userId) {return userDao.get(userId);}
    	public UserDao getUserDao() {return userDao;}
        @Autowired //3
    	public void setUserDao(UserDao userDao) {this.userDao = userDao;}
    }
    
    public class SpringMain {
    	public static void main(String[] args) {
            //构建spring容器conent对象
    		AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("output01.spring");
            //获取service对象,无需处理对象的创建和属性的填充工作,对象都交给spring管理,使用时从spring获取即可
    		UserService userService = ac.getBean(UserService.class);
    		User user = userService.get(1L);
    		System.out.println(user);
    		ac.close();
    	}
    }
    
  2. AOP

    aop是基于spring的bean管理而扩展出的动态代理功能,spring通过jdk或cglib根据相应的配置生成指定对象的代理对象(子类对象),可以对特定方法的前后增加自定义的业务逻辑,且对原有代码无侵入; 可以帮助我们解决一些通用性的业务逻辑,例如通过aop实现方法的耗时统计日志等操作;下面我们写一段代码进行简单的演示,打印方法的名称和方法耗时,其他对象不变增加LogUtil类实现日志打印功能,为了体现效果UserServiceImpl get方法中打印一行日志。

    //@Aspec注解标记此类是一个切面类;@Component为了spring扫描创建当前bean对象;@EnableAspectJAutoProxy为了spring开始aop代理功能
    //@Around指定在被拦截的方法前后执行代码
    //输出效果,实际生产中为了更方便的排查日志,应该把开始和结束时间打印在一行日志中,本案例为了更方便的展示效果故输出为两行
    /*
    LogUitl: output01.spring.UserServiceImpl.get START: 1676811558765
    UserServiceImpl.get do......
    LogUitl: output01.spring.UserServiceImpl.get END: 1676811558765
    */
    
    @Service 
    public class UserServiceImpl implements UserService {
    	private UserDao userDao;
    	@Override
    	public User get(Long userId) {
            System.out.println("UserServiceImpl.get do......");
            return userDao.get(userId);
        }
    	public UserDao getUserDao() {return userDao;}
        @Autowired
    	public void setUserDao(UserDao userDao) {this.userDao = userDao;}
    }
    
    @Aspec
    @Component
    @EnableAspectJAutoProxy
    public class LogUitl {
    
    	@Around(value = "execution(* output01.spring.UserService.*(..))")
    	public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    		String className = proceedingJoinPoint.getTarget().getClass().getName();
    		String methodName = proceedingJoinPoint.getSignature().getName();
    
    		long startTime = System.currentTimeMillis();
    		try {
    			System.out.println("LogUitl: " + className + "." + methodName + " START: " + startTime);
    			return proceedingJoinPoint.proceed();
    		} finally {
    			long endTime = System.currentTimeMillis();
    			System.out.println("LogUitl: " + className + "." + methodName + " END: " + endTime);
    		}
    	}
    }
    
  3. 事务

    事务是spring基于Aop功能的基础上帮我们实现的数据据事务管理功能,可以在系统抛出运行时异常时自动回滚数据库事务,避免手动管理数据库事务的繁琐,spring可以根据实际的配置实现不同的事务传播方法,事务隔离级别;

posted @ 2023-02-19 21:19  铵铵静静  阅读(25)  评论(0编辑  收藏  举报