[ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)

 网络编程     |      2019-11-29

生机勃勃、Spring 使用 AspectJ 进行 AOP 的开支:注明的章程

style="font-size: 18px; font-family: "Microsoft YaHei"; color: #0000ff">案例描述:

style="font-size: 18px; font-family: "Microsoft YaHei"">   style="color: #008000">贰个平时的事情提交,在运用里面会唤起commit超时,战败。

sunbet官网 , style="background-color: #ffff00"> 本小说所提到的剧情均为网络摘抄,只做学习所用。

style="font-family: "Microsoft YaHei"; font-size: 14px">
style="font-family: "Microsoft YaHei"; font-size: 18px">Spring 基于注脚的布署
style="font-family: "Microsoft YaHei"; font-size: 14px">   @Required 评释应用于bean属性的setter方法。 阐明受到震慑的bean在安顿时必须置于xml配置文件中,不然容器会抛出二个BeanInitialzationException极度。

style="font-family: "Microsoft YaHei"; font-size: 14px">   @Autowired 证明对在何地和如何达成机关连接提供了越多的微薄的操纵。
[ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)。 style="font-family: "Microsoft YaHei"; font-size: 14px">     Setter方法中的@Autowired
style="font-family: "Microsoft YaHei"; font-size: 14px">     能够在setter方法上增多@Autowired 来除去成分,当spring 碰到二个setter方法中采纳的@Autowired注脚,它会在点子中打算执行byType自动接二连三
style="font-family: "Microsoft YaHei"; font-size: 14px">     属性中的@Autowired
style="font-family: "Microsoft YaHei"; font-size: 14px">     能够在性质中选用@Autowired 注脚来除去setter方法,那时候应用为活动连接属性传递的时候,Spring会将这个传递过来的值或然引用自动分配给那么些属性。
style="font-family: "Microsoft YaHei"; font-size: 14px">     构造函数中的@Autowired
style="font-family: "Microsoft YaHei"; font-size: 14px">     能够在布局函数中应用@Autowired,表明当创立bean时,即便在xml文件中并未有利用要素配置bean,构造函数也会被活动连接。
style="font-family: "Microsoft YaHei"; font-size: 14px">   @Autowired的(required=false)选项
style="font-family: "Microsoft YaHei"; font-size: 14px">     默许意况下,@Autowired申明意味着信任是必得的,他临近于@Required表明,不过你能够运用@Autowired的(required=false)选项关闭暗许行为。固然不为
style="font-family: "Microsoft YaHei"; font-size: 14px">     该属性传递任何参数,亦能够运作,且不会报出十三分。

style="font-family: "Microsoft YaHei"; font-size: 14px">   @Qualifier 注解
style="font-family: "Microsoft YaHei"; font-size: 14px">     当您创制具备八个相仿等级次序的bean时,何况想要用二个属性只为他们之中的贰个进展装配,那一个地方下,能够运用@Qualifier表明和@Autowired申明来通过点名哪
style="font-family: "Microsoft YaHei"; font-size: 14px">     贰个实在的bean将会棉被服装配来清除混乱。

     public class Student {
            private Integer age;
            private String name;
            public void setAge(Integer age) {
                this.age = age;
            }   
            public Integer getAge() {
            return age;
            }
            public void setName(String name) {
                this.name = name;
            }      
            public String getName() {
            return name;
            }
        }

        public class Profile {
            @Autowired
            @Qualifier("student1")
            private Student student;
            public Profile(){
                System.out.println("Inside Profile constructor." );
            }
            public void printAge() {
                System.out.println("Age : " + student.getAge() );
            }
            public void printName() {
                System.out.println("Name : " + student.getName() );
            }
        }

         <bean id="profile" class="com.tutorialspoint.Profile">
            </bean>

            <!-- 消除混乱 指向此处的student1 -->
            <bean id="student1" class="com.tutorialspoint.Student">
                <property name="name"  value="name1" />
                <property name="age"  value="11"/>
            </bean>

 
            <bean id="student2" class="com.tutorialspoint.Student">
                <property name="name"  value="name2" />
                <property name="age"  value="2"/>
            </bean>

      以上的代码用于解释Qualifier 评释的成效。

   JSR-250注解

      @PostConstruct 和 @PreDestroy 注解
      能够应用 @PostConstruct 注脚作为开端化回调函数的一个代表,@PreDestroy 表明作为销毁回调函数的贰个代表

 1        public class HelloWorld {
 2                 private String message;
 3                 public void setMessage(String message){
 4                     this.message  = message;
 5                 }
 6                 public String getMessage(){
 7                     System.out.println("Your Message : " + message);
 8                     return message;
 9                 }
10                 @PostConstruct
11                 public void init(){
12                     System.out.println("Bean is going through init.");
13                 }
14                 @PreDestroy
15                 public void destroy(){
16                     System.out.println("Bean will destroy now.");
17                 }
18             }

    

    @Resource 注解
      能够在字段中依然 setter 方法中使用 @Resource 注释,它和在 Java EE 5 中的运作是千篇豆蔻年华律的。
      正视注入时查找bean的法规
      1.既不点名name属性,也不内定type属性,则自动按byName方式张开搜寻。若无找到切合的bean,则回降为一个原始类型进行拓宽检索,假诺找到就注入。
      spring会去找bean成分里name属性值和变量名大器晚成致的bean,并不是找id属性与变量名大器晚成致的,找不到位报错
      2.只是钦命了@Resource注脚的name,则按name后的名字去bean成分里找找有与之齐名的name属性的bean。
      3. 只内定@Resource注脚的type属性,则以前后文中找到类型相称的唯生龙活虎bean进行装配,找不到或许找到八个,都会抛出分外
        4. 既钦点了@Resource的name属性又指定了type,则从Spring上下文中找到唯生机勃勃相配的bean进行装配,找不到则抛出特别

  基于java的配置

     @Configuration 和 @Bean 注解

        带有@Configuration 的声明类表示那些类能够应用IoC容器作为bean定义的源于。 @Bean 评释告诉Spring,三个含有@Bean 的笺注方法将回到贰个指标,该对

          象应该被注册为在Spring应用程序上下文中的bean。

*       *

        @Configuration
        public class HelloWorldConfig {
            @Bean 
            public HelloWorld helloWorld(){
                return new HelloWorld();
            }
        }
        
        public class Main {
            public static void main(String[] args) {
                ApplicationContext ctx = 
                new AnnotationConfigApplicationContext(HelloWorldConfig.class);

                HelloWorld helloWorld = ctx.getBean(HelloWorld.class);

                helloWorld.setMessage("Hello World!");
                helloWorld.getMessage();
            }    
        }

     注入 Bean 的信赖

      当@Bean 信赖对方时,表明这种依赖比较轻巧,只要有多个bean方法调用另一个。

      @Configuration
      public class AppConfig {
        @Bean
        public Foo foo() {
          return new Foo(bar());
         }
        @Bean
        public Bar bar() {
          return new Bar();
        }
      }

      @Import注解

        注明允许从另三个陈设类中加载@Bean定义。相仿于江湖代码所示:

     @Configuration
        public class ConfigA {
            @Bean
            public A a() {
                return new A(); 
            }
        }    
        
        @Configuration
        @Import(ConfigA.class)
        public class ConfigB {
            @Bean
            public B a() {
                return new A(); 
            }
        }

      今后,当实例化上下文时,无需同有时间制定ConfigA.class和ConfigB.class,独有ConfigB.class供给提供

        public static void main(String[] args) {
            ApplicationContext ctx = 
            new AnnotationConfigApplicationContext(ConfigB.class);
            A a = ctx.getBean(A.class);
            B b = ctx.getBean(B.class);
        }

    生命周期回调

      @Bean 申明协理钦命自便的初阶化和销毁的回调方法,就好像在 bean 成分中 Spring 的 XML 的开端化方法和销毁方法的性质

    

        public class Foo {
            public void init() {
                // initialization logic
            }
            public void cleanup() {
                // destruction logic
            }
        }

        @Configuration
        public class AppConfig {
            @Bean(initMethod = "init", destroyMethod = "cleanup" )
            public Foo foo() {
                return new Foo();
            }
        }

      指定 Bean 的范围:

      私下认可范围是单实例,不过足以重写带有@Scope注明的该措施。

        @Configuration
        public class AppConfig {
            @Bean
            @Scope("prototype")
            public Foo foo() {
                return new Foo();
            }
        }
        
        

 

 

1.1 引进相关的jar包

意气风发、理论知识

sunbet官网 1

1、关于commit原理,事务提交进程

1.2 引进spring的布置文件

sunbet官网 2

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
        <!-- 开启AOP操作 -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>


</beans>

  1、寻找改善的数据页:

1.3 编写目的类

    1、假设该数据页在内部存款和储蓄器中,则一贯是内部存款和储蓄器读;

package com.Kevin.aop;
/**
 * 使用注解方式进行AOP操作
 * 被增强类
 * @author Kevin
 *
 */

public class Book {

    public void add(){
        System.out.println("Book Method add----");
    }

}

    2、假若该数据页内部存款和储蓄器中未有,物理读,就从磁盘调入内部存款和储蓄器;

1.4 配置目的类 

  2、磁盘中的undo页调入内部存储器;

<!-- 创建对象 -->
        <bean id="book" class="com.Kevin.aop.Book"></bean>

  3、先将本来的多少存入undo,然后修正数据(数据页成脏页卡塔尔;

1.5 开启aop申明的机关代理

  4、改善数据的音讯生成redo数据存入log_buffer(内存buffer_pool的一个空中,默许16M卡塔尔中;

 <!-- 开启AOP操作 -->
        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
mysql> show variables like '%log_buffer%';
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.01 sec)

1.6 AspectJ 的 AOP 的注解 

  5、log_buffer通过log线程(后台线程,极度努力卡塔尔,持续不断的将redo音信写入disk的innodb_log_file中;

  ●  Pointcut:切入点,在类中有成都百货上千方法能够被升高,而独有实际拉长的办法称为切入点;
  ●  Advice:文告/加强,实际拉长的逻辑,被称之为文告/加强,比如拓宽日志功用,日志成效被誉为文告/巩固;

mysql> show variables like 'innodb_log_file%';
+---------------------------+----------+
| Variable_name             | Value    |
+---------------------------+----------+
| innodb_log_file_size      | 50331648 |
| innodb_log_files_in_group | 2        |
+---------------------------+----------+
2 rows in set (0.01 sec)

 

  6、事务提交,特意触发log线程,将盈余的log_buffer中的redo数据音信写入磁盘中,数据量已剩非常的少,写完提交成功。

        前置公告:在措施从前实践
        前置布告:在点子之后实施
        十分文告:方法出现卓殊
        最后通知:在前置之后施行
        环绕公告:在形式以前和事后实践

注意:

  ●  Introduction(引导介绍卡塔尔:引导介绍是生龙活虎种新鲜的通报在不改善类代码的前提下, Introduction 可以在运营期为类动态地增加一些主意或 Field;

  1、更改记录前,必供给先写日记;

  ●  Target(指标对象卡塔尔(英语:State of Qatar):代理的对象对象;

    “日志先行”,那是数据库最核心的尺码。

  ●  Weaving(织入卡塔尔(قطر‎:是指把进步应用到指标对象来创设新的代办对象的经过(spring 接收动态代理织入,而 AspectJ 接收编写翻译期织入和类装在期织入);

  2、事务提交进度中,必供给确认保障日志先落盘,本领算事务提交成功。

  ●  Proxy(代理):一个类被 AOP 织入加强后,就发出一个结出代理类。

  3、意外掉电,内部存款和储蓄器脏页错失,不过磁盘的innodb_log_file中存放了redo日志新闻,待重启服务器,MySQL通过读取磁盘的log_files数据,自动将数据的更正重新跑黄金年代边。

  ●  Aspect:切面,将升高应用到具体方法上的历程称为切面(把巩固用到切入点进度)
  ●  Joinpoint:连接点,类里面能够被拉长的不二秘诀,被号称连接点

style="font-size: 18px; font-family: "Microsoft YaHei"">Q: style="color: #008000">为何mysql commit速度一连超快,尽管专门的工作改革的数据量恐怕相当大?

style="font-size: 18px; font-family: "Microsoft YaHei"">A:

style="font-size: 18px; font-family: "Microsoft YaHei"">  因为职业提交,而不是对磁盘数据开展改正,而是将改善数据的redo音讯透过后台log线程写入磁盘的redo logfile中,完结mysql commit,无论专门的学问改革的数据量有多大,这些进度速度是便捷的。

style="font-size: 18px; font-family: "Microsoft YaHei"">  而内部存款和储蓄器中的脏块,约等于改过后的数据页,平常景况下是由后台相关write线程周期性的将脏页数据刷入磁盘中,保障innodb buffer pool有丰盛的干净块、可用块。

 

2、关于rollback原理,回滚进程

1.7 编写切面类

  1、MySQL读取内部存款和储蓄器中undo页音讯

package com.Kevin.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Bean;

/**
 * 使用注解方式进行AOP操作
 * 增强类
 * @author Kevin
 *
 */

@Aspect
public class StrBook {

    //在方法上使用注解完成增强配置
    @Before(value="execution(* com.Kevin.aop.Book.*(..))")
    public void add(){
        System.out.println("Before Strength---");
    }

}

  2、通过undo音讯找到脏页,反着对数据开展校正

1.8 配置切面

  3、do、undo的岁月相仿,且都会产成redo消息

<bean id="strBook" class="com.Kevin.aop.StrBook"></bean>

  4、事务提交

 

MySQL回滚管理体制:

二、Spring的JDBC模版

  倘使线程中断,事务未有付诸,undo会将记录此新闻,待另一会话进度连上,查看该块数据消息,MySQL自动回滚举办多少页修正,然后被读取。也便是说为了防止系统因为rollback被hang住,通过间接杀死进度的点子,中断事务,等待后来者要读取该数量新闻时张开回滚,再回来结果。

2.1 Spring 提供了重重长久层本事的沙盘模拟经营类简化编制程序

style="font-size: 18px; font-family: "Microsoft YaHei"">Q: style="color: #008000">rollback为何临时候超级慢,rollback的高危害和高风险制止方法?

style="font-size: 18px; font-family: "Microsoft YaHei"">A:

style="font-size: 18px; font-family: "Microsoft YaHei"">  rollback的时辰决意于回滚前业务订正数据的时间,处理量大回滚时间长,管理量小回滚时间短。

style="font-size: 18px; font-family: "Microsoft YaHei"">  1、rollback风险:轻易招致系统被hang住;

style="font-size: 18px; font-family: "Microsoft YaHei"">  2、危机幸免方法:直接杀死会话进程可能mysql进度。

sunbet官网 3

3、存款和储蓄写入品质深入分析

2.2 引进开垦相关的包

Q:mysql commit,存款和储蓄为啥写速度能够维持在0ms,极少现身1ms场所?

sunbet官网 4

A:

2.3 创建一个测验类

  对于仓库储存来讲,写质量相当高:假诺存款和储蓄cache总有空闲空间的景况下,事务提交,将log buffer中多余的少之甚少的redo数据写入存款和储蓄cache,即为实现mysql commit,那么些历程是豆蔻年华对生龙活虎快的(可以保险在0ms,极少现身1ms情状卡塔尔(英语:State of Qatar),后续redo数据由cache写入磁盘的进度是后台实行。

package com.Kevin.jdbc;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

/**
 * 使用jdbcTemplate模版操作数据库
 * @author Kevin
 *
 */
public class JdbcTemplateDemo1 {
    //添加操作
    @Test
    public void add(){
        //设置数据库信息
        DriverManagerDataSource dataSource=new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///springday3");
        dataSource.setUsername("root");
        dataSource.setPassword("admin");

        //创建jdbcTemplate对象,设置数据源
        JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);

        //调用jdbcTemplate对象里的方法实现操作
        //创建sql语句
        String sql="insert into user values(?,?)";
        int rows=jdbcTemplate.update(sql,"Kevin","admin");
        System.out.println(rows);
    }
}    

4、存款和储蓄品级的灾备(同城灾备卡塔尔

 

  1、灾备同步进程:commit

三、将连接池交给Spring管理

    1、redo、binlog写入本地存款和储蓄cache;

3.1 Spring的c3p0连接池配置

    2、通过互联网同步binlog写入远端同步的服务器的存款和储蓄cache中;

【引入相应的jar包】

    3、响应本地数据库;

sunbet官网 5

    4、事务提交成功;

【编写c3p0安排文件】

  2、风险:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 配置c3p0连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 注入属性 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql:///springday3"></property>
        <property name="user" value="root"></property>
        <property name="password" value="admin"></property>
    </bean>

    <!-- 创建jdbcTemplate对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- 把dataSource传递到模版对象里 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

</beans>

    互联网现身难题(随机信号断续,缆线断了卡塔尔国,以致写hang住,commit超时战败。

3.2 将数据库连接消息配置到属性文件中

  3、解决:

【定义属性文件】

    通过超时设置,网络中断超越限制,自动将风姿罗曼蒂克并改为灾备异步,尽可能少的震慑工作commit超时战败。

//设置数据库信息
        DriverManagerDataSource dataSource=new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///springday3");
        dataSource.setUsername("root");
        dataSource.setPassword("admin");

 

上一篇:没有了 下一篇:没有了