• spring框架


    spring
    1.优点
      1)针对接口编程,解耦合
      2)aop:变向切面编程,动态增加功能
      3)方便集成框架,mybatis,hibernate,strust等
      4)降低j2ee接口的使用难度

    2.spring是干什么的
      管理bean及bean的依赖关系的一个容器,为降低bean之间耦合度问题而开发,核心是控制反转(IOC)和面向切面编程(AOP)
        控制反转(IOC:):对象的创建交给容器来完成
        面向切面编程(AOP):系统级服务和主业务逻辑分开,降低耦合度,使系统级服务织入主业务逻辑

    IOC:
    3.(配置式开发)spring容器都干了什么
      读取配置文件
      创建bean对象(使用反射机制调用无参构造方法),将对象保存在内存Map中
      给有依赖关系的对象赋值

    4.spring容器的实现接口有哪些
      ApplicationContext:创建容器时就创建了bean对象,并将对象放到内存中
      BeanFactory:创建容器对象时不创建bean对象(懒加载模式:用的时候才创建)

    5.spring框架中bean对象的创建过程,有几种创建方式
      在配置文件中使用bean标签注册bean对象
      2种方式:
        默认创建方式:调用bean对象的无参构造方法
        (实例)工厂模式创建bean:需要在配置文件中注册工厂对象以及注册工厂对象的方法(此方式耦合度高,因为实例工厂中写死了Java对象)

    6.什么是工厂模式,什么时候用工厂模式
      工厂模式:当创建对象时若比较繁琐,可以将这些繁琐的创建过程封装到一个方法中,调用此方法来创建对象,这就是工厂模式
      什么时候用:创建复杂对象时

    7.spring框架中bean的作用域
      在配置文件中,使用scope关键子给bean指定作用域
      spring支持5种作用域:singleton(单例作用域,spring默认的作用域)、prototype(原型作用域:每创建一次都是新的对象)、request、session、globalSession

    8.spring中给bean对象的属性赋值(也叫注入)
      对bean对象属性赋值同样是由容器完成的
      根据注入方式不同分为2种:
        设值注入:调用bean对象的set方法给属性赋值(常用)
        构造注入:调用bean对象的构造方法时给属性赋值并创建对象(不常用)
      根据注入的实现方式不同也分2种:
        1.基于配置文件:(掌握,内容较多,不常用)
        2.基于注解:(掌握,常用)

    9.注解式开发bean对象的创建,创建前需要做什么
      在配置文件中使用context:component-scan标签注册组件扫描器
      多个包下都使用了注解怎么解决:
        1.使用多次context:component-scan标签
        2.base-package值中使用逗号或分号分隔(推荐使用此方法)
        3.指定父包(不推荐使用)

    10.基于注解方式开发,创建bean对象有哪些注解,怎么用
      以下注解均是用于创建对象:
        @Repository:用在Dao层的类上
        @Service:用在Service层的类上
        @Controller:用在UI层的类上
        @Component:以上三个注解都不能使用或者不合格使用时就使用此注解,不使用value属性时,对象的名称默认是类名的首字母小写

    11.基于注解方式开发,设置bean对象的作用域
      使用@Scope注解,在value值中设置

    12.基于注解方式开发,给bean对象赋值有哪些注解,怎么用
      以下注解均是用于给属性赋值:
        @Value:给简单类型属性赋值,可以放在属性定义上(不需要set方法的),可以放在属性的set方法上
        @Autowired:spring框架中的。给引用类型的属性赋值,默认是按类型注入的。若按名称来注入需同时使用@Qualifier(value="BeanID")注解
          Autowired有一个属性required,默认为true,意思是必须成功给引用类型赋值,否则程序终止并报错。若为false意思是不能成功赋值则为null
        @Resource:不是spring框架中的,是jdk中的。给引用类型的属性赋值,默认是按类型注入的。若按名称来注入需要使用@Resource注解的name属性,name属性指定BeanID
      给属性赋值一般是设值注入,不使用构造注入。

    13.bean对象的生命始末
      基于配置文件:在bean标签中使用属性init-method、destroy-method
      基于注解方式:在方法上使用@PostConstruct(bean对象初始化后执行)、@PreDestroy(bean对象销毁之前执行)

    14.spring框架中配置文件和注解同时使用,谁的优先级高
      配置文件的优先级高

    15.spring框架中配置文件和注解的优缺点
      配置文件:(灵活)对其所作的修改无需编译代码,只需重启服务器即可
      注解:(高效)配置方便,直观,但修改代码后需重新编译

    AOP:
    16.什么是代理模式,什么时候用代理模式
      代理模式:为目标对象提供代理服务,从而控制对目标对象的访问及对目标对象的功能增强
      什么时候用:当访问一个目标对象时达不到想要的效果,可以访问代理对象,代理对象可以对其进行访问控制及功能增强
      代理模式的作用:功能增强(对目标对象目标方法的返回值做处理)和控制访问(比如控制在某些条件下可以调用目标对象的方法,某些条件下不能调用)
      代理模式的分类:
        静态代理:代理对象在程序运行前就已经定义好了,其与目标对象的关系在程序运行前就已经确立了
        动态代理:目标对象的代理对象是由代理生成工具在程序运行时由JVM通过反射机制动态生成的,代理对象与目标对象的关系也是在程序运行时才确定的
          jdk动态代理:
            1.目标对象实现接口方法(有了目标对象、目标方法)(jdk动态代理要求目标对象要实现接口)
            2.实现InvocationHandler接口创建调用处理器类,并且实现invoke方法(调用处理器的作用是截取对目标方法的调用)
              public Object invoke(Object proxy,Method method, Object[] args)
                Object proxy:代理对象
                Method method:目标方法
                Object[] args:目标方法的参数
                返回值Object:目标方法的返回值
            3.通过Proxy接口的newProxyInstance方法创建代理对象
              static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
                ClassLoader loader:目标对象的类加载器(target.getClass().getClassLoader())
                Class[] interfaces:目标对象的接口(target.getClass().getInterfaces())
                InvocationHandler h:调用处理器
            4.通过代理对象调用目标方法
          cjlib动态代理:(当目标对象没有实现接口时可以使用cglig动态代理)cglib动态代理原理是生成目标对象的子类(继承过来的),对子类进行增强,子类即是代理对象(cglib动态代理要求目标类不能是final的)
            1.导入cglib库
            2.创建目标对象(不需要实现接口,且不能是final修饰的)
            3.实现MethodInterceptor接口创建调用处理器,并且实现intercept方法(相当于cglib中的invoke方法)
              public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy)
                Object proxy:代理对象
                Method method:目标方法
                Object[] objects:目标方法的参数
                MethodProxy methodProxy:方法的代理对象(与cglib的区别)
                返回值object:目标方法的返回值
            4.通过Enhancer(增强器)类创建代理对象
              Enhancer enhancer = new Enhancer();
              // 设置enhancer对象的父类
              enhancer.setSuperclass(target.class);
              // 设置enhancer的回调对象
              enhancer.setCallback(new MyMethodInterceptor());
              // 创建代理对象
              ProxyObject proxy= (ProxyObject)enhancer.create();
            5.通过代理对象调用目标方法

    17.什么是AOP
      面向切面编程,动态的将与主业务逻辑无关的代码(如事务、日志等)织入到主业务逻辑当中,代码上不会出现混杂。AOP的底层采用的是动态代理,默认采用的是jdk的动态代理。

    18.AOP中几个重要的编程术语
      切面:反之交叉业务逻辑(例如事务、日志)。实际上就是对主业务逻辑的功能增强。常用的切面实现有通知和顾问。
      织入:将切面代码插入到目标对象的过程。
      连接点:可以被切面织入的方法,通常业务接口中的方法均是连接点。
      切入点:织入了切面代码的方法,即业务接口中被增强了的方法是切人点,未被增强的方法是连接点。
      目标对象:要被增强的对象。
      通知:切面的一种实现。通知决定了切入的时间点(切入点决定了可以切入的位置)。例如是在目标方法执行之前执行切入,还是在目标方法执行之后执行切入
      顾问:切面的一种实现。是一种高级的通知。

    19.spring框架对AOP思想的实现之一:通知
      spring框架对AOP的思想进行了实现,实现的方式是通知。通知有四个接口:前置通知(MethodBeforeAdvice)、后置通知(AfterReturningAdvice)、环绕通知(MethodInterceptor)、异常通知(ThrowsAdvice)

    20.spring框架之前置通知
      实现MethodBeforeAdvice接口的类为前置通知,是对目标方法的增强。
      MethodBeforeAdvice接口中只有一个before方法:public void before(Method method,Object[] args,Object target)
        Method method:目标方法
        Object[] args:目标方法的参数
        Object target:目标对象
      前置通知的特点:
        1.前置通知中before方法是在目标方法执行之前执行的
        2.前置通知不能改变目标方法的执行流程
        3.前置通知不能改变目标方法的执行结果
      配置文件方式实现步骤,需要在配置文件中配置如下信息:
        1.注册目标对象
        2.注册通知类(切面)
        3.注册代理工厂类:
          3.1在代理工厂内指定目标对象
          3.2在代理工厂内指定目标对象实现的接口
          3.3在代理工厂内指定切面

    21.spring框架之后置通知
      实现AfterReturningAdvice接口的类为后置通知,是对目标方法的增强。
      AfterReturningAdvice接口中只有一个afterReturning方法:public void afterReturning(Object returnValue,Method method,Object[] args,Object target)
        Object returnValue:目标方法的执行结果(与前置通知的区别),afterReturning方法返回的也是此值
        Method method:目标方法
        Object[] args:目标方法的参数
        Object target:目标对象
      后置通知的特点:
        1.后置通知中afterReturning方法是在目标方法执行之后执行的
        2.后置通知不能改变目标方法的执行流程
        3.后置通知不能改变目标方法的执行结果,但是能获取到目标方法的执行结果

    22.spring框架之环绕通知
      环绕通知又称方法拦截器,是功能最强的一种通知。
      实现MethodInterceptor接口的类为环绕通知,是对目标方法的增强。
      MethodInterceptor接口中只有一个invoke方法:public Object invoke(MethodInvocation invocation)
        返回值Object:目标方法的执行结果(可以是增强的结果)
        Object[] args = invocation.getArguments():获取目标方法的参数列表,可以对其参数进行修改从而改变目标方法的执行流程
        Object retVal = invocation.proceed():调用目标方法,可以对返回值retVal进行修改从而改变目标方法的执行结果
      环绕通知的特点:
        1.环绕通知中invoke方法可以在目标方法的之前或者之后执行
        2.环绕通知可以改变目标方法的执行流程
        3.环绕通知可以改变目标方法的执行结果

    23.spring框架之异常通知
      实现ThrowsAdvice接口的类为异常通知。该接口中没有定义要实现的方法,称为标识接口。
      虽然形式上没有方法,但有必须要实现的方法afterThrowing,该方法在ThrowAdvice接口注释中,有四个重载的方法,一般常用的是afterThrowing(Exception ex).
      异常通知的作用:在目标方法抛出异常后,根据不同的异常在异常通知中做出相应的处理(比如记录异常信息到文件/数据库、发送邮件/短信,写监控程序)

    24.spring框架中无接口的类怎么实现通知
      无接口的类通过继承实现增强,配置和上面默认的jdk动态代理一样,当业务类是无接口时,spring会自动使用cglib动态代理织入切面。

    25.spring框架中有接口的类如何使用cglib动态代理
      其他配置和jdk动态代理方式一样,只需增加一个proxyTargetClass属性(是否使用类代理,默认为false)或者optimize(优化选项,默认为false)属性即可:
      <property name="proxyTargetClass" value="true">或者<property name="optimize" value="true">

    26.spring框架通知的缺点
      spring框架中对AOP思想的实现(通知)有两个缺点:
        1.spring框架默认会给所有的业务方法织入切面,也就时会对所有的业务方法添加相同的交叉业务(例如日志)
        2.不支持注解式开发

    27.spring框架对AOP思想的实现之二:顾问
      顾问能够弥补通知的缺点,也就是能够将不同的切面织入到不同的业务方法中

    28.spring框架顾问的实现接口
      PointcutAdvisor接口,该接口有两个常用的实现类:
        NameMatchMethodPointcutAdvisor:名称匹配方法切入点顾问
        RegexpMethodPointcutAdvisor:正则表达式匹配方法切入点顾问
      配置文件方式实现步骤,需要在通知配置信息基础上添加如下配置信息:
      1.注册顾问(通知+切入点)
        1.1指定顾问的通知
        1.2指定顾问的切入点(业务方法):支持使用通配符*
          NameMatchMethodPointcutAdvisor:指定切入点的属性为interceptorName(s),名称匹配方法只包含方法名
          RegexpMethodPointcutAdvisor:指定切入点的属性为pattern(s),正则表达式匹配方法的范围包含包名、接口名、方法名
      2.修改代理工厂中的切面:由通知改为顾问

    29.AspectJ框架对AOP思想的实现
      对AOP思想进行了实现的框架中,Spring框架只是其中一个。AspectJ框架也对AOP思想进行了实现,而且其实现更简洁,使用更方便,且支持注解式开发。
      所以Spring框架又将AspectJ引入到了自己的框架中,也就是说可以在Spring框架中直接使用AspectJ。

    30.AspectJ框架的常用通知类型
      1.前置通知
      2.后置通知
      3.环绕通知
      4.异常通知
      5.最终通知(与Spring的区别):无论程序执行是否正常,该通知都会执行

    31.在Spring框架中以注解方式使用AspectJ
      1.在配置文件中需要做的工作:
        1.1在spring容器的配置文件中,引入spring-aop.xsd的约束文件
        1.2注册目标对象
        1.3注册切面类
        1.4注册自动代理生成器:<aop:aspectj-autoproxy />
      2.定义业务接口和实现类
      3.定义切面类,在类上加入@Aspect注解。在类中定义增强功能的方法,方法上面使用相应的"通知注解(切入点表达式)"
        前置通知注解:@Before(value="execution(* com.bjpowernode.ba01.SomeServiceImpl.doFirst())"),通知方法参数内使用JoinPoin jp参数(需要是第一个出现的参数),可以获取切入点方法的定义内容和切入点的参数列表
        后置通知注解:@AfterReturning(value="execution()",returning="result"),能够获取目标方法的执行结果但不能更改目标方法的执行结果,value属性用来指定切入点表达式,returning属性用来指定目标方法的返回值所使用的参数,自定义切面方法的参数名(参数类型为Object)需要和returning中参数名一致
        环绕通知注解:@Around(value="execution(* *..SomeServiceImpl.doFirst())"),自定义切面方法中加入参数ProceedingJoinPoint pjp,此参数用来执行目标方法的调用,环绕通知有返回值Object
        异常通知注解:@AfterThrowing(value="execution(* *..SomeServiceImpl.doFourth())",throwing="ex"),自定义切面方法中加入参数Throwable ex,此方法参数表示目标方法执行过程中抛出的异常对象,thowing属性值要和方法参数变量名一致
        最终通知注解:@After(value="execution()")
        定义切入点注解:@Pointcut
          该注解为了解决:多个通知方法使用相同的exection表达式,编写维护时较繁琐的问题
          该注解的使用方法:将@Poincut注解定义在一个没有具体内容的方法之上(标识方法),通知方法注解的value值为此方法名

    32. 在Spring框架中以配置文件方式使用AspectJ
      1.在配置文件中需要做的工作:
        1.1在spring容器的配置文件中,引入spring-aop.xsd的约束文件
        1.2注册目标对象
        1.3注册切面类
        1.4配置aop

    <!--定义aop-->
    <aop:config>
        <!--定义切入点-->
        <aop:poincut expression="execution()" id="" />
        <aop:poincut expression="execution()" id="" />
        <!--定义切面-->
        <aop:aspect>
            <aop:before method="" poincut-ref="" />
            <aop:after-returning method="" poincut-ref="" returning="" />
            <aop:around method="" poincut-ref="" />
            <aop:after-throwing method="" poincut-ref="" throwing="" />
            <aop:after method="" poincut-ref="" />
        </aop:aspect>
    </aop:config>

      2.定义业务接口和实现类
      3.定义切面类,在类中定义增强功能的方法

    DAO:
    33.spring框架中JdbcTemplate的使用
      JdbcTemplate:为了避免直接使用JDBC而带来的复杂冗长的代码,Spring框架提供了JdbcTemplate模板类来简化对JDBC的操作,并且数据源对象DataSource与模板对象JdbcTemplate均可通过bean的形式在配置文件中定义,充分发挥了依赖注入

    34.JdbcTemplate是否是线程安全的
      JdbcTemplate类本身不是线程安全的,但是它所获取的连接是从ThreadLocal中获取的,所以使用JdbcTemplate对数据库操作是线程安全的

    35.spring中操作数据库时,数据源如何配置
      数据源的种类:
        DriverManagerDataSource:Spring默认的数据源
        BasicDataSource:DBCP数据源
        ComboPoolDataSource:CP30数据源

      DBCP和C3P0数据库连接池的区别:

        DBCP没有数据库连接的自动重连功能:即如果数据库在程序执行过程中重新启动了,原来程序对数据库的访问功能失效,需要重新启动应用程序才可以。
        C3P0有数据库连接的自动重连功能:数据库重新启动,不需要重新启动应用程序。

    36.数据源放在属性配置文件(properties)中,在mvc配置文件中引入属性配置文件
      第一种方式:使用bean标签(不常用)
        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
          <property name="location" value="classpath:dbconfig.properties">
        </bean>
      第二种方式:使用context标签(常用)
        在mvc配置文件中需要有context约束
        <context:property-placeholder location="classpath:dbconfig.properties" ignore-unresolvable="true"/>

    37.spring事务管理常用接口有哪些
      事务管理器接口:PlatformTransactionManager,主要用于完成事务的提交、回滚,及获取事务的状态信息
        它的实现类常用的有2个:
          DataSourceTransactionManager:使用 JDBC 或 iBatis 进行持久化数据时使用
          HibernateTransactionManager:使用 Hibernate 进行持久化数据时使用
        Spring事务的默认回滚方式是:发生运行时异常时回滚,发生受查异常时提交(也可以自定义改为回滚)。
          运行时异常:RuntimeException及其子类为运行时异常。例如NullPointerException
          受查异常(编译时异常):RuntimeException及其子类之外的为受查异常。例如SQLException
      事务定义接口:TransactionDefinition,该接口定义了事务的三个特性:事务隔离级别,事务传播行为,事务默认超时时间
        事务隔离级别:TransactionDefinition接口中事务隔离级别均以"ISOLATION_"开头
          default:采用数据库默认的事务隔离级别。mysql默认事务隔离级别为repeatable_read,oracle和sqlserver默认事务隔离级别为read_committed(一般采用数据库默认的事务隔离级别)
          read_uncommitted:读未提交,未解决任何并发问题
          read_committed:读已提交,解决脏读(脏读即读到的是未提交的数据),但存在不可重复读和幻读
          repeatable_read:可重复读(可重复读即多次读取得到的数据是一样的),解决脏读、不可重复读,但存在幻读
          serializable:串行化,不存在并发问题
      事务传播行为:业务方法在互相调用的时候,事务是如何管理的。事务的传播行为是加在业务方法上的。事务的传播行为常量都是以"PROPAGATION_"开头的
          required:指定的方法必须在事务内执行,spring默认的传播行为。若调用者没有事务则新创建一个事务
          supports:指定的方法支持当前事务,若调用者没有事务,也可以以非事务方式运行,例如查询操作
          mandatory:(强制的)被调用的方法必须在调用者的事务内执行,若当前调用者没有事务,则直接抛出异常
          requires_new:总是创建一个新事务,若当前调用者存在事务,就将调用者的事务挂起,直到被调用者的事务执行完成
          not_supported:被调用的方法不能在事务环境中执行,若调用者方法存在事务,则将事务挂起
          never:被调用的方法不能在事务环境中执行,若有事务则抛出异常
          nested:被调用的方法必须在事务内执行,若调用者方法存在事务,则在嵌套事务内执行,调用者事务不会被挂起,若调用者方法没有事务则新建一个事务
      事务默认超时时间:常量timeout_default,一般使用默认时间。事务最长的执行时间,超过该执行时间之前所有操作将回滚

    38.spring中的事务管理的实现方式有哪些
      spring中事务管理的底层使用AOP思想实现的。
      方式一:使用spring的事务代理工厂(TransactionProxyFactoryBean):配置繁琐
      方式二:使用spring的事务注解(常用):
        1.在业务层的公共方法上或者类上使用@Transactional注解,实现事务织入指定方法或类中的全部方法
        2.在配置文件中使用tx标签配置事务管理器驱动并注册事务管理器(需要引用tx约束文件)
      方式三:使用AspectJ的AOP配置(掌握):相比注解方式,不用在业务层实现类中一一加入注解了





























  • 相关阅读:
    ASP.NET 防盗链的实现[HttpHandler]
    html打印表格每页都有的表头和打印分页
    spring是怎样管理mybatis的及注入mybatis mapper bean的
    浅谈Log4j和Log4j2的区别
    git tag — 标签相关操作
    java cocurrent包
    线程实现异步
    使用Shell脚本查找程序对应的进程ID,并杀死进程
    shell脚本监测文件变化
    spring boot的几种配置类型
  • 原文地址:https://www.cnblogs.com/luna-hehe/p/14623014.html
Copyright © 2020-2023  润新知