Spring

1.  控制反转(IOC)

      将原本在程序中手动创建对象的控制权和对象之间的相互依赖关系交由给Spring框架来管理,这样可以很大程度上简化应用的开发,

      容器: Spring包含并管理应用程序对象的生命周期和配置。

 2. 面向切面(AOP):

       将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可扩展性和可维护。 Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

   经典的基于代理的AOP:使用Java代码实现,编写Advice、PointCut,然后提供给Advisor使用。开启自动代理后,即可在applicationContext中获得增强后的bean。  

/**
 * 打印日志的切面类
 */
@Aspect
@EnableAspectJAutoProxy
public class LogAspect implements Ordered {

    //定义切点,即需要增强的方法
    @Pointcut(value = "execution(public double cn.monolog.entity.MathTool.*(..))")
    public void getPointcut() {}

    /**
     * 在目标方法之前执行的通知方法
     * @param joinPoint 切点
     */
    @Before(value = "getPointcut()")
    public void startLog(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        System.out.println("方法" + joinPoint.getSignature() + "即将执行,参数列表:" + Arrays.asList(args));
    }

    /**
     * 在目标方法之后执行的通知方法
     * @param joinPoint 切点
     */
    @After(value = "getPointcut()")
    public void endLog(JoinPoint joinPoint) {
        System.out.println("方法" + joinPoint.getSignature() + "执行完毕");
    }

    /**
     * 目标方法正常返回时的通知方法
     * @param joinPoint 切点
     * @param result 目标方法的返回值,通过@AfterReturning定义
     * 注:当通知方法存在多个参数时,JoinPoint必须放在第一位
     */
    @AfterReturning(value = "getPointcut()", returning = "result")
    public void returningLog(JoinPoint joinPoint, Object result) {
        System.out.println("方法" + joinPoint.getSignature() + "返回值为:" + result);
    }

    /**
     * 目标方法发生异常时的通知方法
     * @param joinPoint 切点
     * @param exception 目标方法抛出的异常,通过@AfterThrowing定义
     * 注:当通知方法存在多个参数时,JoinPoint必须放在第一位
     */
    @AfterThrowing(value = "getPointcut()", throwing = "exception")
    public void exceptionLog(JoinPoint joinPoint, Exception exception) {
        System.out.println("方法" + joinPoint.getSignature() + "抛出异常,异常信息为:" + exception);
    }

    //Ordered接口提供的排序方法,返回值为执行顺序,数字越小越靠前
    @Override
    public int getOrder() {
        return 1;
    }
}

   3.Spring容器 SpringMVC容器 web容器的关系  

      项目启动首先 servlet初始化,初始化过程中通过web.xml中spring的配置加载spring配置,初始化spring容器和springmvc容器。待容器加载完成。servlet初始化完成,则完成启动。HTTP请求到达web容器后,会到达Servlet容器,容器通过分发器分发到具体的spring的Controller层。执行业务操作后返回结果。

  4. MVC框架 Spring MVC可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成。Spring MVC下我们一般把后端项目分为Service层、Dao层、Entity层、Controller层(控制层,返回数据给前台页面)

  • 用户发送请求至前端控制器DispatcherServlet;
  • DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;
  •  处理器映射器根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;
  •  DispatcherServlet 调用 HandlerAdapter处理器适配器,请求执行Handler; HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
  •  Handler执行完成返回ModelAndView;
  •   HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
  •  DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
  •  ViewResolver解析后返回具体View;
  •   DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)DispatcherServlet响应用户。

 

 

 3.Spring框架中的BeanFactory接口和ApplicationContext接口有什么理解?二者有什么区别?

       BeanFactory接口是Spring框架的顶层接口,是最原始的接口, 包含了种 bean 的定义。通过new BeanFactory的实现类来启动Spring容器时,并不会创建Spring容器里面的对象,只有在每次通过getBean()获得对象时才会创建。BeanFactory 还包含 了 bean 生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)

       applicationContext接口是用来替代BeanFactory接口的,通过new ApplicationContext接口的实现类ClassPathXmlApplicationContext来启动Spring容器时,就会创建容器中配置的所有对象。从表面上看, application context 如同 bean factory 一样具有 bean 定义、 bean 关联关系的设置,根据请求分发 bean 的功能。但 applicationcontext 在此基础上还提供了其他的功:提供了支持国际化的文本消息;    统一的资源文件读取方式;  已在监听器中注册的 bean 的事件
        

 4.Spring中的bean的作用域有哪些?:@Scope(scopeName=”singleton”)。

      singleton:唯一bean实例,Spring中的bean默认都是单例的。

      prototype:多例bean实例 每次请求都会创建一个新的bean实例。

      request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

      session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP session内有效。

      global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义,Spring5中已经没有了。

 5.修改bean的作用域

@Configuration
public class ComponentConfig {
        @Bean("person")

        @Scope("prototype")

        public Person getPerson() {

                return new Person("百度", 10000);
 }

}

5.Spring框架中用到了哪些设计模式

   工厂设计模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象。

   代理设计模式:Spring AOP功能的实现。

   单例设计模式:Spring中的bean默认都是单例的。

   模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。

   包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

   观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。

   适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。

 6.Spring中的单例bean的线程安全问题?

  单例bean存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。

  有两种常见的解决方案:

    在bean对象中尽量避免定义可变的成员变量(不太现实)。

   .在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal中(推荐的一种方式)。

6.Spring中的bean生命周期?

    1)bean的定义  bean的调用和bean的销毁。

       Bean容器找到配置文件中Spring Bean的定义。

    2)bean的初始化

     Bean容器利用Java Reflection API创建一个Bean的实例。如果涉及到一些属性值,利用set()方法设置一些属性值。如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。如果实现了其他*Aware接口,就调用相应的方法。例如

    Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例.

    3)bean的调用

      如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法。如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法或.如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。

     .如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。

    4)bean的销毁

       当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。/.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。

8. 事务的特性?

     原子性Atomic)    一致性(Consistent)   隔离性(Isolated):   持久性(Durable):

9.事务中隔离级别呢?

  读未提交(uncommitted)、读已提交(committed)、可重复读(repeatable_read)、串行化(serializable)

10简单介绍一下Spring中的事务管理。

   事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

  Spring的核心配置文件applicationContext.xml中配置事务,主要配置三大方面:事务管理器、事务通知和定义事务性切面

   Spring并不直接管理事务,而是提供了多种事务管理器,每个事务管理器都会充当某一特定平台的事务实现的门面,这使得门户在Spring中使用事务时,几乎不用关注实际的事务实现是什么。

  当配置好事务管理器之后,在spring中具体配置事务时,又有两种选择:一种是编码事务(了解),一种是声明式事务。声明式事务是通过事务属性来定义的,具体的说,是通过传播行为、隔离级别、只读提示、事务超时及回滚规则来进行定义的。

11.事务的传播行为指什么?

  在业务(service)方法之间平行调用时,如何来处理事务的问题。

  Spring中定义事务传播行为的属性有7种。分别是 rquired、requires_new、supports、not_supported、mandatory、nested、never. 我们常用的是propagation=”REQUIRED”,

   默认的就是REQUIRED,指得是支持当前事务,如果不存在,就新建一个(默认),所以这个属性不用配置。其余6个属性几乎不用。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值