• spring-01-依赖注入


    1.普通创建bean(默认为无参构造创建)

    <bean id="user" class="com.kuang.pojo.User">
           <property name="name" value="kuangshen"/>
       </bean>
    
    • 1
    • 2
    • 3

    2.通过有参构造创建bean(三种方式)

    <!-- 第一种根据index参数下标设置 -->
    <bean id="userT" class="com.kuang.pojo.UserT">
       <!-- index指构造方法 , 下标从0开始 -->
       <constructor-arg index="0" value="kuangshen2"/>
    </bean>
    <!-- 第二种根据参数名字设置 -->
    <bean id="userT" class="com.kuang.pojo.UserT">
       <!-- name指参数名 -->
       <constructor-arg name="name" value="kuangshen2"/>
    </bean>
    <!-- 第三种根据参数类型设置 -->
    <bean id="userT" class="com.kuang.pojo.UserT">
       <constructor-arg type="java.lang.String" value="kuangshen2"/>
    </bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.xml的bean标签配置

    <bean id="hello" name="hello2 h2,h3;h4" class="com.kuang.pojo.Hello">
    
    • 1

    4.各种类型数据的bean注入(9种方式)
    1.常量

    <bean id="student" class="com.kuang.pojo.Student">
         <property name="name" value="小明"/>
     </bean>
    
    • 1
    • 2
    • 3

    2.ref引用类型

    <bean id="student" class="com.kuang.pojo.Student">
         <property name="name" value="小明"/>
         <property name="address" ref="addr"/>
     </bean>
    
    • 1
    • 2
    • 3
    • 4

    3.数组注入(books为一个数组)

     <bean id="student" class="com.kuang.pojo.Student">
         <property name="books">
             <array>
                 <value>西游记</value>
                 <value>红楼梦</value>
                 <value>水浒传</value>
             </array>
         </property>
     </bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.list注入

    <property name="hobbys">
         <list>
             <value>听歌</value>
             <value>看电影</value>
             <value>爬山</value>
         </list>
     </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.map注入

    <property name="card">
         <map>
             <entry key="中国邮政" value="456456456465456"/>
             <entry key="建设" value="1456682255511"/>
         </map>
     </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6.set注入

    <property name="games">
         <set>
             <value>LOL</value>
             <value>BOB</value>
             <value>COC</value>
         </set>
     </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    7.null注入

    <property name="wife"><null/></property>
    
    • 1

    8.properties注入

    <property name="info">
         <props>
             <prop key="学号">20190604</prop>
             <prop key="性别"></prop>
             <prop key="姓名">小明</prop>
         </props>
     </property>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    9.p命名空间和c命名空间注入
    导入约束
    xmlns:p=“http://www.springframework.org/schema/p”
    xmlns:c=“http://www.springframework.org/schema/c”
    c命名空间是有参构造命名,而p空间是直接对应属性命名set方法。


    5.自动装配
    1.自动注入引用类型(还有两个引用类型cat/dog。都是user的子类。)

    public class User {
       private Cat cat;
       private Dog dog;
       private String str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
     <bean id="user" class="com.kuang.pojo.User" autowire="byName">
       <property name="str" value="qinjiang"/>
    </bean>
    
    • 1
    • 2
    • 3
    <bean id="dog" class="com.kuang.pojo.Dog"/>
    <bean id="cat" class="com.kuang.pojo.Cat"/>
    <bean id="cat2" class="com.kuang.pojo.Cat"/>
    
    <bean id="user" class="com.kuang.pojo.User" autowire="byType">
       <property name="str" value="qinjiang"/>
    </bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意byType必须只能是一个类型,有两个同类型的cat会报错。
    6.注解开发
    1.使用之前的配置
    引入头
    xmlns:context=“http://www.springframework.org/schema/context”
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    开启注解支持
    context:annotation-config/
    引入aop依赖
    另外还要开启包扫描的功能,才能使用注解

    <!--指定注解扫描包-->
    <context:component-scan base-package="com.kuang.pojo"/>
    
    • 1
    • 2

    然后就可以使用@AutoWired
    如果@AutoWired加上@qualifier,两个合并使用。@qualifier可以指定对应装配的name。使用byname类型进行装配。
    @Resource等于上面两者的合并功能。

    2.常用注解
    1.@value可以进行属性的注入
    2. @controller/@service/@repository。都是注入bean,作用是一样的,只是区分不同层的类。

    3.配置类
    @configuration表示将类作为配置类。
    @Import()表示将某个配置类与当前配置类合并起来。(与@configuration作用类似)

    7.SpringAOP
    导入依赖

    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
       <groupId>org.aspectj</groupId>
       <artifactId>aspectjweaver</artifactId>
       <version>1.9.4</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    SpringAOP总共五种的Advice。
    前置通知/后置通知/环绕通知/异常抛出通知/引介通知
    1.xml实现aop
    方式一:

     <!--注册bean-->
       <bean id="userService" class="com.kuang.service.UserServiceImpl"/>
       <bean id="log" class="com.kuang.log.Log"/>
       <bean id="afterLog" class="com.kuang.log.AfterLog"/>
    
       <!--aop的配置-->
       <aop:config>
           <!--切入点 expression:表达式匹配要执行的方法-->
           <aop:pointcut id="pointcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
           <!--执行环绕; advice-ref执行方法 . pointcut-ref切入点-->
           <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
           <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
       </aop:config>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    方式二:

    public class DiyPointcut {
    
       public void before(){
           System.out.println("---------方法执行前---------");
      }
       public void after(){
           System.out.println("---------方法执行后---------");
      }
       
    }
    
    <!--第二种方式自定义实现-->
    <!--注册bean-->
    <bean id="diy" class="com.kuang.config.DiyPointcut"/>
    
    <!--aop的配置-->
    <aop:config>
       <!--第二种方式:使用AOP的标签实现-->
       <aop:aspect ref="diy">
           <aop:pointcut id="diyPonitcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
           <aop:before pointcut-ref="diyPonitcut" method="before"/>
           <aop:after pointcut-ref="diyPonitcut" method="after"/>
       </aop:aspect>
    </aop:config>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2.注解实现aop

    @Aspect
    public class AnnotationPointcut {
       @Before("execution(* com.kuang.service.UserServiceImpl.*(..))")
       public void before(){
           System.out.println("---------方法执行前---------");
      }
    
       @After("execution(* com.kuang.service.UserServiceImpl.*(..))")
       public void after(){
           System.out.println("---------方法执行后---------");
      }
    
       @Around("execution(* com.kuang.service.UserServiceImpl.*(..))")
       public void around(ProceedingJoinPoint jp) throws Throwable {
           System.out.println("环绕前");
           System.out.println("签名:"+jp.getSignature());
           //执行目标方法proceed
           Object proceed = jp.proceed();
           System.out.println("环绕后");
           System.out.println(proceed);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    还需要以下配置

    <!--第三种方式:注解实现-->
    <bean id="annotationPointcut" class="com.kuang.config.AnnotationPointcut"/>
    <aop:aspectj-autoproxy/>
    
    • 1
    • 2
    • 3
    <aop:aspectj-autoproxy />
    设置代理方式。有一个proxy-target-class属性,默认为false,表示使用jdk动态代理织入增强,
    
    • 1
    • 2

    8.声明式事务
    文件头的配置

    xmlns:tx="http://www.springframework.org/schema/tx"
    
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    • 1
    • 2
    • 3
    • 4

    事务类型配置为JDBC

    <bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
           <property name="dataSource" ref="dataSource" />
    </bean>
    
    • 1
    • 2
    • 3
    <!--配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <!--配置哪些方法使用什么样的事务,配置事务的传播特性-->
           <tx:method name="add" propagation="REQUIRED"/>
           <tx:method name="delete" propagation="REQUIRED"/>
           <tx:method name="update" propagation="REQUIRED"/>
           <tx:method name="search*" propagation="REQUIRED"/>
           <tx:method name="get" read-only="true"/>
           <tx:method name="*" propagation="REQUIRED"/>
       </tx:attributes>
    </tx:advice>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    还需要配置AOP

    <!--配置aop织入事务-->
    <aop:config>
       <aop:pointcut id="txPointcut" expression="execution(* com.kuang.dao.*.*(..))"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Spring有以下7种事务:
    propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
    propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
    propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
    propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
    propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
    propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

  • 相关阅读:
    基于Matlab的超像素图像分割
    Nginx反向代理服务器搭建(超详细)
    rsyslog服务端接收不到日志问题排查步骤
    链表——算法专项刷题(四)
    [架构之路-12]:目标系统 - 硬件平台 - 单核CPU的架构与基本工作原理
    Kotlin + 协程 + Room 结合使用
    远程访问Linux的DataEase数据可视化分析,有哪些推荐的工具?
    Vuex的使用
    shell之tail命令
    mysql查看当前连接数
  • 原文地址:https://blog.csdn.net/qq_44895567/article/details/126711219