• Spring加强


    1. IOC(依赖注入):一个bean依赖于另一个bean,Spring创建bean对象,注入另一个bean对象

    a)       先导入Spring的核心jar包

    b)       构造参数注入(在配置文件中配置注入)

                         i.            根据构造器参数的顺序注入

          

          <!-- 按照索引注入,索引开始为0 -->

          <bean id="MyBean" class="cn.itsource._01_.MyBean">

                      <constructor-arg index="0" value="666" />

                      <constructor-arg index="1" value="张二娃" />

          </bean>

                       ii.            根据构造器参数的名称注入

            

          <!-- 按照名称注入,名称必须一致 -->

          <bean id="MyBean" class="cn.itsource._01_.MyBean">

                      <constructor-arg name="id" value="1" />

                      <constructor-arg name="name" value="张三娃" />

          </bean>

                      iii.            根据构造器的类型注入

          

          <!-- 按照类型注入,必须一一对应,不能有重复的类型-->

          <bean id="MyBean" class="cn.itsource._01_.MyBean">

                      <constructor-arg type="java.lang.Long" value="1" />

                     <constructor-arg type="java.lang.String" value="张四娃" />

          </bean>

                      iv.            构造参数时有个是我们的对象

    1. 在构造参数bean外面定义好我们自己对象给他一个id属性,构造时引用id值就行
    2. 在构造参数bean里面添加一个内部bean

    c)        怎么配置一个Properties对象:配置连接池的时候经常用

                         i.            不支持中文

    1. <property name="props1">

                  <value>

                              Jpa.dialect=org.Jpa.dialect.HSQLDialect

                              Jpa.driverClassName=com.mysql.jdbc.Driver

                  </value>

      </property>






                       ii.            不支持中文

    1. <property name="props2">

                  <props>

                              <prop key="Jpa.dialect">org.Jpa.dialect.HSQLDialect</prop>

                              <prop key="Jpa.driverClassName">com.mysql.jdbc.Driver中文 </prop>

                  </props>

      </property>

    2. Xml自动注入方式

    a)       通过名称自动注入

    b)       通过类型自动注入

    1. 全注解自动注入

    a)       先在xml配置文件里配置context命名空间约束条件
    xmlns:context=http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd

    b)       配置让Spring扫描类和注解支持
    <!-- 进行包的扫描,去看类上面是否有相应的标签配置 -->
    <context:component-scan base-package="cn.itsource._03_anno(要扫描的包)" />
    <!-- 这个不是必须的(spring3.2版本前使用) 配上后兼容性好 -->
    <context:annotation-config />

    c)        在类上面加上注解

    d)       注解配置bean的名称
    当一个接口有两个实现类时,Spring不知道用哪个实现类时,我们就在实现类上面打上@Repository(”自定义一个名称”)

    e)       调用实现类的时候就除了打上@Autowired,再加@ Qualifier("实现类自定义的名称")
    @Autowired和@resources作用是一样的
    他们的区别:@Autowired 是Spring提供的注解、可以与Spring进行无缝连接,@Resources是java原生提供的注解
    @Awtowired先根据类型匹配,匹配诶不上根据名称匹配
    @Resources先根据名称匹配,匹配诶不上根据类型匹配

    1. XML手动注入,XML自动注入,注解自动注入,怎么选择?
      初学使用xml版,手动注入

    熟练之后可以使用xml自动注入现在趋势:注解版

    如果是注解版,就全部使用注解(自己写类),不要混用,其它框架已经写好的类仍然使用xml进行配置

    如果是xml版,在测试的使用必须使用注解注入(因为测试框架使用注解版)

    只有自己写的类,才可以全部用注解,别人写的类使用注解必须去修改别人的源码,添加响应的注解标志

    1. AOP面向切面编程(业务功能的拓展)

    a)  定义:是为了解决一些重复代码抽取问题,比如说我们在使用事务时有很多重复代码,但是又不能抽取到一个公共的类里面的这种情况。

    b)  AOP的一些术语

    c)  Spring的AOP功能

    1. 代理模式(通俗点就是中间商)

    a)  静态代理(与现实生活不太符合实际,可能会有多个角色,就需要写多个构造方法)

    1.        i.     三个角色:抽象角色,真实角色,代理角色
      真实角色直接实现抽象角色,而代理角色要实现抽象角色,必须要通过构造方法传入真实角色才能实现。
    2.       ii.     缺点:如果说有其他接口和方法,就需要写许多代理类

    b)  动态代理

    1.        i.     有接口的代理类:使用jdk的动态代理
    2.       ii.     没有接口的代理类,使用CGLIB的动态代理模式,类不能由final修饰

    c)  动态代理的实现

    1.        i.     自定义一个代理类实现Invorcationhander接口,赋写invork方法,
    2. String实现AOP的两种方案(jdk和cglib)

    a)  若目标对象实现了若干接口,就使用jdk动态代理

    b)  若目标对象没有实现了若干接口,就使用cglib动态代理
    注意:对接口创建代理要优于对类创建代理,降低系统的耦合,标记为final的方法不能被代理。

    1. XML版实现AOP

    a)  添加aop的jar包

    b)  添加命名xmlns:aop=http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

    c)  直接使用环形增强
    <bean id="txManager" class="cn.itsource.spring.transcational.TxManager"/>
       <!--
    环绕通知:有了环绕,就不需要用另外几个通知(会重复)
             
    如果有两个以上的通知,建议使用环绕
    -->
      
    <aop:config>
           <aop:pointcut expression="execution(* cn.itsource.spring.I*Service.*(..))" id="pointcut" />
               <aop:aspect  ref="txManager">
                   <!--环绕通知-->
                  
    <aop:around method="around" pointcut-ref="pointcut" />
               </aop:aspect>
       </aop:config>

    1. 注解版实现AOP

    一定要注意:无论是注解的方式还是xml配置方式配置事务,配置了环绕通知后一定不能再配置其他通知,两个同时配置的话会发生冲突,事务不会发生作用。

    a)  配置文件中配置
    <!-- 组件搜索 -->
    <context:component-scan base-package="cn.itsource.spring" />
    <!-- 支持aop注解 -->
    <aop:aspectj-autoproxy />

    b)  配置事务管理器和环绕通知方法
    import org.aspectj.lang.ProceedingJoinPoint;

    import org.aspectj.lang.annotation.After;

    import org.aspectj.lang.annotation.AfterReturning;

    import org.aspectj.lang.annotation.AfterThrowing;

    import org.aspectj.lang.annotation.Aspect;

    import org.aspectj.lang.annotation.Before;

    import org.aspectj.lang.annotation.Pointcut;

    import org.springframework.stereotype.Component;

     

    @Component

    @Aspect //AOP的类注解

    public class TxManager {

                //设置切点

                @Pointcut("execution(* cn.itsource.aopanno.I*Service.*(..))")

                public void pointcut(){}

                //前置通知

                @Before("pointcut()")

                public void begin(){

                           System.out.println("开启事务....");

                }

                //后置通知

                @AfterReturning("pointcut()")

                public void commit(){

                           System.out.println("提交事务...");

                }

                //异常通知

                @AfterThrowing(pointcut="pointcut()",throwing="e")

                public void rollback(Throwable e){

                           System.out.println("回滚事务....");

                           System.out.println(e.getMessage());

                }

                //最终通知

                @After("pointcut()")

                public void close(){

                           System.out.println("关闭资源....");

                }

    }

    环绕通知方法:

    //温馨提醒:如果要使用环绕通知的话,把其它几个通知的注解去掉(不然会出现重复)

    @Around("pointcut()")

    public Object around(ProceedingJoinPoint joinPoint){

                Object object = null;

                try {

                           begin();

                           object = joinPoint.proceed(); //执行相应的代码

                           commit();

                } catch (Throwable e) {

                           rollback(e);

                }finally{

                           close();

                }

                return object;

    10. 创建bean的方式

    a)  实例化一个有公共无参构造的方法

    b)  使用factoryBean接口创建bean
    使用于在核心类里面没有提供构造方法的bean,创建方式:自定义一个类实现FactoryBean,然后在配置里面配置这个bean。

    c)  面试题:说一下FactoryBean和BeanFactory的区别

    1.        i.     BeanFactory接口顶级父工厂,获取bean的实例
    2.       ii.     FactoryBean接口,不能通过默认的无参构造方法获取bean,需通过子类的getObject()返回实例。
    3.     iii.     区别:BeanFactory可以直接实例化,FactoryBean不能实例化,需要通过实现类来获取对象

    d)  集成静态简单工厂

    1.        i.     自定义一个类,类里面定义一个获取实例的静态方法。
    2.       ii.     配置文件里面配置该实例,和该方法

    e)  集成实例简单工厂

    1.        i.     自定义一个类,在类里面定义一个实例工厂的方法

    配置文件配置该bean和方法

  • 相关阅读:
    HttpClient4.5 post请求xml到服务器
    关于spring mybateis 定义resultType="java.util.HashMap"
    Git安装和使用(谨记)
    使用 Lombok 简化项目中无谓的Java代码
    为什么JSP会比Beetl慢
    Apache Commons Codec 与消息摘要算法(hash算法)
    加密解密基础问题:字节数组和(16进制)字符串的相互转换
    Spring AOP 不同配置方式产生的冲突问题
    Java 权限框架 Shiro 实战二:与spring集成、filter机制
    Java 权限框架 Shiro 实战一:理论基础
  • 原文地址:https://www.cnblogs.com/8888-lhb/p/11273907.html
Copyright © 2020-2023  润新知