Springフレーム---奥行き

67909 ワード

1.Spring IOC
IOC技術:逆転を制御しても、(注入に依存して)
コントロール反転:ビーンのライフサイクルはあなたのコントロールではなく、Spring容器に任せて管理します.
SpringフレームはどうやってIOCを利用しますか?        制御反転を実現し、Spring容器は対象を実用化してくれますが、DI(依存注入)はできませんでした.
作用:        (1)ビーンを構築する        (2)ビーン間に依存関係があると、自動的に注入してくれます.    利点:        結合:低結合、インタフェースに向けたプログラミング思想を実現する.
2.Spring AOP
ダイナミックエージェント設計モード    原理と静的な代理設計モードは本質的な区別がない:          被代理類、代理類、被代理と代理類は同じインターフェースです.        エージェントクラスの作成過程に違いがあります.        (1)スタティックエージェント:                  自分で代行類を編纂して、代理種類は自分でインターフェースを実現します.        (2)ダイナミックエージェント:                  プロキシは自分で編纂する必要がなくて、彼のProxy.newProxyinstance(xx)の静的な方法                プログラム実行中に、プロキシクラスが動的に生成されます.                InvocationHandler:エージェントの参照が含まれています.
AOP:カット面向けプログラミング
プロキシモードの主な役割:          業務コードがない場合は、追加の機能を入力します.    原理:SpringフレームはIOCの機能を持っていますので、この機能を利用して業務Beanを配置することができます.プロキシ設計モード(ダイナミック)        例えば、Acceount ServiceImpl                その後、Springフレームワークは、動的エージェント設計モードを用いてAccerviceImplの動的エージェントオブジェクトを作成する.        その後、AccentServiceImplの業務方法に基づいて、対応する機能を追加することができます.        そのSpringはこの技術をAOP面向けプログラミングと呼びますが、実はプログラマが知らないうちにその業務方法に追加の機能を入れます.
 
XML構成を使用して具体的な操作を実現します.    (1)SpringのAOP機能を使うには、jarを導入する必要があります.  pom.xml    (2)自分でうどんを作る.InvocationHandlerに似ています.        プロキシインターフェース   :  業務インタフェース        被代理類:被代理口を実現し、被代理類も業務実現類と呼ばれます.        例:class CalFfabImpl implements ICalFab
コードの例:
Mavenプロジェクト
pom.xml追加プラグイン

        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjrtartifactId>
            <version>1.8.10version>
        dependency>       
 
        <dependency>
            <groupId>aopalliancegroupId>
            <artifactId>aopallianceartifactId>
            <version>1.0version>
        dependency>
        
        
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.8.10version>
        dependency>
                
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
            <version>${spring.version}version>
        dependency>            
 
リソース設定ファイルを追加します.beans.xml
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
     
   <bean id="calFab" class="day02.aop.CalFabImpl">bean>
   <bean id="selfAspectRef" class="day02.aop.SelfAspect">bean>
   
   
   <aop:config>
           
           <aop:aspect ref="selfAspectRef">
               
               <aop:pointcut expression="execution(* day02.aop.CalFabImpl.*(..))" id="selfPointcut"/>
               
               <aop:before method="testBefore" pointcut-ref="selfPointcut"/>
               <aop:after method="testAfter" pointcut-ref="selfPointcut"/>
               <aop:around method="testAround" pointcut-ref="selfPointcut"/>
           aop:aspect>
   aop:config>
   
beans>
 
新しいインターフェースICalFab.java
 1 /**
 2  *     
 3  * @author   
 4  */
 5 public interface ICalFab {
 6     
 7     int calFaByLoop(int n);
 8     int calFabByRecursion(int n); 
 9 
10 }
 
新しいクラス実現インターフェース:
/**
 *      :    
 * @author   
 */
class CalFabImpl implements ICalFab{
    @Override
    public int calFaByLoop(int n) {
        int n1=1,n2= 1,n3=0;
        for (int i = 3; i < n; i++) {
            n3=n1+n2;
            n1=n2;
            n2=n3;
        }
        return n3;
    }
    @Override
    public int calFabByRecursion(int n) {
        if(n==1||n==2) return 1;
        return calFabByRecursion(n-1)+calFabByRecursion(n-2);
        
    }
    
    
}
 
新しいクラス:SelfAsppect.java
import org.aspectj.lang.ProceedingJoinPoint;

/**
 *         :  xml    。
 * @author   
 *
 */
public class SelfAspect {
    //--  :Before   Advice
    public void testBefore() {
        System.out.println("before do something...");
    }
    //--  :after     
    public void testAfter() {
        System.out.println("after do Something...");
    }
    //--   :Around             
    public int testAround(ProceedingJoinPoint jp) {
        int result = 0;
        try {
            long start = System.currentTimeMillis();
            result = (int)jp.proceed();    //--       
            long end = System.currentTimeMillis();
            System.out.println(end-start+"ms");
        } catch (Throwable e) {
            e.printStackTrace();
        }    
        return result;
    }
} 
 
新しい呼び出しクラス:Invoker.java
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Invoker 
 *         
 * @author   
 *
 */
public class Invoker {
    public static void main(String[] args) {
        //-- 1. Spring  
        ApplicationContext ctx =
                new ClassPathXmlApplicationContext("application.xml");
        //-- 2.      
        ICalFab calFab= (ICalFab)ctx.getBean("calFab");
        //-- 3.       
        System.out.println(calFab.calFaByLoop(40));
        System.out.println(calFab.calFabByRecursion(40));
        System.out.println(calFab instanceof ICalFab);
        
    }
}
 
 
 
 
注釈構成を使用して具体的な操作を実現する:
(1)Config類はxmlの構成の代わりになります.          @EnbaleAspect JAtoProxy/--SpringAopの機能を有効にします.        //--SpringのIOC機能を有効にする        @Configration        @ComponentScan({「package 1」、「package 2」))    (2)うどんの作成.
 
コードの例:
新しいインターフェースICalFab.java 
/**
 *     
 * @author   
 *
 */

public interface ICalFab {
    
    int calFaByLoop(int n);
    int calFabByRecursion(int n); 

}
 
新しい実装クラスのCalFabImpl.java
import org.springframework.stereotype.Component;

/**
 *      :    
 * @author   
 */
@Component    //-- Spring IOC
class CalFabImpl implements ICalFab{
    @Override
    public int calFaByLoop(int n) {
        int n1=1,n2= 1,n3=0;
        for (int i = 3; i < n; i++) {
            n3=n1+n2;
            n1=n2;
            n2=n3;
        }
        return n3;
    }
    @Override
    public int calFabByRecursion(int n) {
        if(n==1||n==2) return 1;
        return calFabByRecursion(n-1)+calFabByRecursion(n-2);
        
    }
    
    
}
 
新しい配置クラスAppConfig.java
 
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 *    
 * @author   
 *   IOC  
 * 
 */
@Configuration
@EnableAspectJAutoProxy //--   SpringAop   
@ComponentScan("day.annocation")//--   
public class AppConfig {
//    @Bean
//    public ICalFab calFabBean() {
//        return new CalFabImpl();
//    }
}
 
 
 
 
新しいクラス:SelfAsppect.java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 *          
 * @author   
 *
 */
@Aspect
@Component
public class SelfAspect {
    
    //-- 1.      ,         
    @Pointcut("execution(* day02.annocation.CalFabImpl.*(..))")
    public void selfPointcut() {
        
    }
    //-- 2.   
    @Before("selfPointcut()")
    public void testBefore() {
        System.out.println("before do something...");
    }
    
    @After("selfPointcut()")
    public void testAfter() {
        System.out.println("After do something...");
    }
    @Around("selfPointcut()")
    public int testAround(ProceedingJoinPoint jp) {
        int result = 0;
        try {
            long start = System.currentTimeMillis();
            result = (int)jp.proceed();    //--       
            long end = System.currentTimeMillis();
            System.out.println(end-start+"ms");
        } catch (Throwable e) {
            e.printStackTrace();
        }    
        return result;
    }
}
 
新しいクラス:Invoker.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Invoker {
    public static void main(String[] args) {
        //-- 1.  Spring  
        ApplicationContext ctx = 
                new AnnotationConfigApplicationContext(AppConfig.class);
        //-- 2.  Beans
        ICalFab calFab =(ICalFab)ctx.getBean("calFabImpl");//--           
        calFab.calFabByRecursion(40);
        
        //-- Web             Spring  , Web          Spring  
        //-- Servlet   
        //--     
        ((AnnotationConfigApplicationContext)ctx).close();
    }
}
 
 
 
3.Spring Test
    SpringのテストフレームはJUnitテストフレームに基づいて作られています.JUnitの再パッケージです.
使用:
設定ファイルのpom.xmlプラグインの導入

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12-beta-3version>
            <scope>testscope>
        dependency>
        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>5.1.7.RELEASEversion>
            <scope>testscope>
        dependency>
 
サンプルテストプロジェクトのコード:
/**
 *     
 * @author   
 *
 */

public interface IUserService {
    void login();
}
 
 
import org.springframework.stereotype.Component;

/**
 *      
 * @author   
 *
 */
@Component
public class UserServiceImpl implements IUserService {

    @Override
    public void login() {
        System.out.println("login success");
        
    }

}
 
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * Spring  
 * @author   
 *
 */
@Configuration
@ComponentScan("day03")
public class AppConfig {
    
    @Bean("hello")
    public String hello() {
        return "hello";
    }
}
 
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 *   
 * @author   
 *
 */
public class Invoker {
    public static void main(String[] args) {
        //-- Spring COntainer
        ApplicationContext ctx = 
                new AnnotationConfigApplicationContext(AppConfig.class);
        //-- 2.
        System.out.println(ctx.getBean("hello"));
    }
}
 
 
JUnitテストコード:
/**
 * 1.    JUnit     
 * @author   
 *
 */

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestDemo {
    private ApplicationContext ctx;
    
    @Before
    public void before() {
        ctx = new AnnotationConfigApplicationContext(AppConfig.class);    
    }
    
    @Test
    public void test() {
        System.out.println(ctx.getBean("hello"));
    }
    
    
}
 
  Spring test     :
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * 2.   Spring test   
 * 
 * @RunWith:    Spring  
 * @ContextConfiguration:   Spring        
 *         Spring   
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {AppConfig.class})
public class TestSpringDemo {
    @Autowired
    private String hi;
    @Autowired
    private IUserService userService;
    
    @Test
    public void test() {
        System.out.println(hi);
    }
    @Test
    public void test1() {
        userService.login();
    }
}
 
 
本プロジェクトのプロファイル:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>com.uek.coursegroupId>
    <artifactId>spring-appartifactId>
    <version>0.0.1version>
    <packaging>warpackaging>

    
    <properties>
        
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        
        <failOnMissingWebXml>falsefailOnMissingWebXml>
        <spring.version>5.1.7.RELEASEspring.version>
    properties>
    
    <dependencies>
        
        
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>3.1.0version>
            <scope>providedscope>
        dependency>

        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>

        
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.48version>
        dependency>

        
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.1.20version>
        dependency>
        
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12-beta-3version>
            <scope>testscope>
        dependency>
        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>${spring.version}version>
            <scope>testscope>
        dependency>
        
        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>${spring.version}version>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>${spring.version}version>
        dependency>
        
        
        
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjrtartifactId>
            <version>1.8.10version>
        dependency>
        
        
        
        <dependency>
            <groupId>aopalliancegroupId>
            <artifactId>aopallianceartifactId>
            <version>1.0version>
        dependency>
        
        
        <dependency>
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.8.10version>
        dependency>
                
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
            <version>${spring.version}version>
        dependency>
        
    
    
    dependencies>



    
    <build>
        <plugins>
            <plugin>
                
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.5.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                configuration>
            plugin>
            
            <plugin>
                <groupId>org.apache.tomcat.mavengroupId>
                <artifactId>tomcat7-maven-pluginartifactId>
                <version>2.2version>
                <configuration>
                    <port>8080port>
                    <path>/airsyspath>
                    
                    <contextReloadable>truecontextReloadable>
                configuration>
            plugin>


        plugins>
    build>
project>