[봄] 게임

간략한 소개

우리의 작문 프로그램은 다양한 범주 사이에 수동으로 다시 할당 할 필요가 인스턴스의 클래스에 따라 의존이 있습니다. 우리는 자동으로 IOC의 컨테이너 빈에 의해 관리되기 때문에, 각각의 사용은 너무 복잡 같은 의존성을 관리해야합니다.

그래서 거기에 구성 파일의 방법에 의해 자동으로 빈을 주입합니다.

스프링 어셈블리 3 xml装配가지 방법 : java装配, 自动装配,.

비교하기 xml装配가 사용하는 것이 좋습니다 java装配.

일반적으로 사용되는 自动装配구성 파일을 줄일 수 있습니다.

자동화 된 조립

자동으로 두 개의 스프링 어셈블리의 관점에서 :

  • 组件扫描: 스프링 빈은 자동으로 생성 된 애플리케이션 컨텍스트를 찾을 수 있습니다.
  • 自动装配: 스프링 어셈블리는 자동으로 빈을 만족시킨다.

프로젝트 구조

.
├── build.gradle
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── yww/
    │   │           ├── Main.java
    │   │           ├── Message.java
    │   │           ├── ReaderConfig.java
    │   │           └── Reader.java
    │   └── resources/
    │       └── beans.xml
    └── test/
        ├── java/
        │   └── com/
        │       └── yww/
        │           └── MainTest.java
        └── resources/

코드

build.gradle프로젝트 빌드 구성.

주석의 일부는 플러그인과 직접 사용하는 것입니다 gradle run프로젝트를 실행하려면 명령. jar{}섹션 구성하는 패키지로 할 수있는 java실행 명령 jar패키지를. (당신이 좋은 마스터 클래스의 전체 이름을 지정해야합니다)

plugins {
    id 'java'
    // id 'application'
}

// mainClassName = 'com.yww.Main'
group 'com.yww'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

ext{
    springVersion = '5.2.0.RELEASE'
}

dependencies {
    compile "org.springframework:spring-core:$springVersion"
    compile "org.springframework:spring-context:$springVersion"
    compile "org.springframework:spring-beans:$springVersion"
    compile "org.springframework:spring-expression:$springVersion"
    compile "org.springframework:spring-aop:$springVersion"
    compile "org.springframework:spring-aspects:$springVersion"

    testCompile "junit:junit:4.12"
    testCompile "org.springframework:spring-test:$springVersion"
}

jar {
    from {
        configurations.runtime.collect{zipTree(it)}
    }
    manifest {
        attributes 'Main-Class': 'com.yww.Main'
    }
}

Message.java사용하여 @Component주석을 때 구성 요소의 검색, 등록 콩.

@Value간단한 할당을 참고. 콩의 구성은 매우 복잡 XML 구성 파일과 다릅니다.

package com.yww;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Message {
    @Value("---hello world---")
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = "this mssage is : " + msg;
    }

}

Reader.java그것은에 따라 Message.java사용하는 @Autowired주사 Message로 콩을 Reader.

여기에서 할 수있다 @Autowired또한 생성자에서 쓸 수있는 멤버 변수에 기록, 둘 중 하나가 될 수를 선택합니다. (생성자가 자동으로 일부 다른 작업을 할 수있는 연결)

package com.yww;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Reader {
//    @Autowired
    private Message msg;

    @Autowired
    public Reader(Message msg){
        this.msg = msg;
    }

    public void print(){
        System.out.println(msg.getMsg());
    }

}

ReaderConfig.java프로파일은 애플리케이션 컨텍스트를 얻는데 사용될 때, 주로, 이러한 완전 개방 구조는 그 내부에 구비. 그 클래스는 어떤 이름을 지정합니다. 다음은 주요 구성 요소 검사가 같은 이름으로 기본 패키지를 열려 @Component빈으로 등록 등의 주석.

전통적으로, 우리는 초기 값을 설정하는 방법이나 조립하는 방법으로, 여기에 몇 가지 구성 작업을 할 수 있습니다. 편의를 위해, 초기 값은 이전에 사용 된 @Value세트.

package com.yww;

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

@Configuration
@ComponentScan
public class ReaderConfig {

    // 可以在配置文件中设置初始值
    // 为了方便直接,就在Message的成员上使用@Value设置了值。
//    @Bean
//    public Message message(){
//        Message message = new Message();
//        message.setMsg("---hi---");
//        return message;
//    }
}

Main.java응용 프로그램을 시작할 수있는 주요 기능. 우리는 종속 관계에 도착, 좋은 콩 자동 조립에 따라하는 방법을 여기에 보여줍니다.

웹 응용 프로그램과 다른, 응용 프로그램은 응용 프로그램을 시작하는 기본 기능이 필요합니다, 전쟁으로 포장 된 기존의 웹 응용 프로그램은 바람둥이로로드되지만 spring boot웹 응용 프로그램은 웹 응용 프로그램을 시작하는 주요 기능을 가질 수있다.

코드 주석 부분은 사용하는 것입니다 xml配置, 빈을 취득하는 방법을 보여줍니다.

package com.yww;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args){
        // xml配置(beans.xml)
//        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//        Message msg = (Message) context.getBean("msg1");
//        System.out.println(msg.getMsg());

        // java配置(ReaderConfig.java) + 获取组件扫描到的bean
        // 测试文件AppTest.java中,可以通过注解@ContextConfiguration加载配置文件上下文,方便使用@Autowired注解获取Bean。
        ApplicationContext context = new AnnotationConfigApplicationContext(com.yww.ReaderConfig.class);
        Reader reader = (Reader) context.getBean(Reader.class);
        reader.print();
    }
}

마지막 남은 테스트 파일이 MainTest.java많이되지는 여기에 말하지만, 당신이 사용할 수있는 @ContextConfiguration주석이 빈의 사용의 맥락 얻을 @Autowired자동 주입 콩, 편리한 테스트를.

달리기

간단하게하기 위해 때문에, 프로젝트가 아닌 웹 프로젝트,이 패키지를 설명하고 실행하는 몇 게시물입니다. (추가하여 쉽게 웹 프로젝트 war플러그인 및 gradle build포장)

작동 방법은 밖으로 몇 가지를 시도 :

  • 방법 1 : 아이디어의 실행은 직접 main클래스는 테스트 클래스를 실행할 수 있습니다 MainTest.java.

  • 방법 2 : Gradle을 사용하여이 필요 build.gradle플러그인 추가, 파일 application및 주요 기능의 설정 좋은 이름을 mainClassName. 마지막으로, 프로젝트 루트 디렉토리 ( build.gradle명령을 같은 디렉토리를 실행) :
gradle run

문제

에서 非web응용 프로그램, 당신은에 의해하지, 문제를 찾을 @Autowired콩을 모르는 비 웹 응용 프로그램에 의한 빈을 취득만을 통해 처리 할 수있는 적절한 주석을 제공하지 않은 ApplicationContext상황 취득 빈 응용 프로그램을. 를 통해 그리고 콩 사이에 달성 될 수있다 @Autowired인수했다.

자바 어셈블리

많은 경우에, 자동화 구성 요소 및 자동 조립을 통해 스캔 할 권장되는 방법입니다. 하지만 당신은 사용할 수 없습니다 응용 프로그램을 조립하기 위해 타사 라이브러리를 원하는 경우 @Component어셈블리를 자동화하는 주석을.

명시 적으로 빈을 구성하려면 구성 파일에 사용할 수 있습니다 @Bean얻을.

// src/main/java/com/yww/ReaderConfig.java
// ...
@Bean
public Message message(){
    Message message = new Message();
    message.setMsg("---hi---");
    return message;
}
// ...

자동 조립의 사용은 동일 빈의 하나 개 이상의 유형을 만들 수 없습니다.

콩의 이름이 변경

기본 빈의 ID와 @Bean같은 주석 메소드 이름.

사용 가능한 name매개 변수 설정 다른 이름.

@Bean(name="msgX")

스캔 조립 구성을 사용하지 않고

스캔 한 구성 요소를 사용하지 않는 경우, 어떻게 다른 구성 또는 콩의 구성을 찾는 방법은?

이 때, 당신은 사용할 수 있습니다 @Import클래스를 가져올 수 있습니다.

package com.yww;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({MessageConfig.class})
public class ReaderConfig {

    // 可以在配置文件中设置初始值
    // 为了方便直接,就在Message的成员上使用@Value设置了值。
//    @Bean
//    @Bean(name="msgX")
//    public Message message(){
//        Message message = new Message();
//        message.setMsg("---hi---");
//        return message;
//    }

    // 这个bean传入的名称可以任意.
    // 但如果在同一个类里声明了名称,像上面那样指定了名词,这里的参数名也必须相同。
    @Bean
    public Reader reader(Message msg){
        System.out.println(msg.getMsg());
        msg.setMsg("---hello---");
        return new Reader(msg);
    }

}

이고, 다른 콩 수입 java配置은 다음과 같이 파일을.

// src/main/java/com/yww/MessageConfig.java
package com.yww;

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

@Configuration
public class MessageConfig {

    @Bean
    public Message message(){
        return new Message();
    }
}

XML 조립

  • Gradle을 응용 프로그램은되어 xml配置배치 src/main/resources/디렉토리에.
  • xml配置상의 web/WEB-INF/디렉토리, 당신은 필요로 web.xml구성 <context-param>.

다음과 같은 구성을 모양.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/

    <bean id="msg1" class="com.yww.Message">
        <property name="msg" value="hello world"/>
    </bean>

</beans>

지정되지 않으면 id, 빈은 여기에 지정됩니다, 정규화 된 클래스 이름으로 지정됩니다 com.yww.Message#0, #0그것은 다른 콩의 동일한 유형의 수입니다.

기타 설정

권장하지 않습니다 때문에 xml配置, 그냥 간단한 구성이의에 메모입니다.

구성이 많이 있습니다 c-命名空间, p-命名空间복잡한 라벨로 교체하십시오.

  • 주입 된 빈 참조 구성, 사출 문자열, 숫자,리스트. (<생성자 ARG>)
  • <빈> JavaConfig 가져 오기 구성을 사용하여 XML 구성.
  • <beans>profile속성입니다.
  • <jdbc>, <jee:jndi-lookup>.
  • <beans>중첩 <beans>.

고급 조립

더 많은 구성, 더 제어 어셈블리를 달성했다.

프로필

임베디드 데이터베이스를 사용하여 테스트 환경 : 보통 우리는 다음과 같은 다양한 환경을 구성 할 필요 h2는 사용하여 프로덕션 환경 jndi취득 데이터베이스를.

(spring4부터 시작) @Profile또한 기반으로 @Conditional구현.

구성 설정

당신은 사용할 수 있습니다 @Profile에 주석을 方法콩을 생성하기에. (본원에 사용 된 바와 같이, JavaConfig구성도 사용될 수있다 xml구성)

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
@PropertySource("application.properties")
public class ReaderConfig {

    @Bean
    @Profile("dev")
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---1");
        return message;
    }

    @Bean
    @Profile("prod")
    public Message message2(){
        Message message = new Message();
        message.setMsg("---hi---2");
        return message;
    }
}

@PropertySource구성 파일을 가져옵니다.

활성 구성

두 속성에 의해 활성화 된 프로파일을 결정 spring.profiles.active하고 spring.profiles.default.

당신이 설정 한 경우 active, 활성화되는 프로필을 확인하려면이 값을 사용합니다. 설정되지 않은 경우 active, 사용 defaultOK. 당신이 설정되지 않은 경우, 그것은 단지 빈을 정의하지 않는 프로파일을 생성합니다.

#src/main/resources/application.properties
spring.profiles.default=dev
spring.profiles.active=prod

테스트 클래스에서는 사용할 수있는 @ActiveProfiles("dev")편리 활성화 구성을.

그렇지 않으면

속성을 설정하는 방법에는 여러 가지가 있습니다 :

  • DispatcherServlet이 초기화 매개 변수를 설정합니다.
  • 웹 응용 프로그램 컨텍스트 매개 변수입니다.
  • JNDI 항목.
  • 환경 변수.
  • JVM 시스템 특성.
  • @ActiveProfiles 주석 설정을 사용하여 통합 테스트 클래스.

실시 예에서, web.xml구성.

    <!-- ... -->
    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>dev</param-value>
    </context-param>
    <!-- ... -->

부록 : 구성 파일이 어떻게 관련이?

어떻게 프로그램 찾기 위해 .properties파일을?

응용 프로그램 프로젝트에서 우리는 통과 @PropertySource, JavaConfig 클래스에 메모를 설정 .properties구성 파일 경로를.

Gradle을 프로젝트에서의 구성 파일 src/main/resources/경로, 또한 디렉토리 폴더에이 파일에 배치 할 수 있습니다. : 같은 src/main/resources/demo/app.properties설정 @PropertySource("demo/app.properties").

웹 프로젝트에서 스프링 웹은 설정 프로파일, 아니이 @PropertySource구성을.

주방, 콩

응용 프로그램의 클래스 경로에서 특정 라이브러리를 만들 때 콩은 포함 후에 생성됩니다 달성하려면 원하는 경우, 또는 빈은 다른 후 경우에만 특정 빈 선언을 작성하거나 특정 환경 변수를 설정한다 빈.

바이 @Conditional로 사용될 수 주석, @Bean주석의 제조 방법. 조건이 콩이 참 만든 경우, 그렇지 않으면 빈은 무시됩니다.

주방, 콩은 spring boot자동 조립의 원칙을 달성 할 수 있습니다.

구성 파일은 "독자"값을 포함하면, 콩을 만들 수 있습니다.

디렉토리 구조

.
├── build.gradle
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── yww/
    │   │           ├── Main.java
    │   │           ├── Message.java
    │   │           ├── ReaderConfig.java
    │   │           ├── ReaderExistsCondition.java
    │   │           └── Reader.java
    │   └── resources/
    │       ├── application.properties
    └── test/
        ├── java/
        │   └── com/
        │       └── yww/
        │           └── MainTest.java
        └── resources/

키 코드

취소 Reader.java클래스 @Component콩의 리더 모드의 사용 조건을 만들려면 여기를 편리하게 메모를.

설정 조건 ReaderExistsCondition.java이 클래스는 인터페이스를 상속합니다 Condition.

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
@PropertySource("application.properties")
public class ReaderConfig {

    @Bean
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---");
        return message;
    }

    @Bean
    @Conditional(ReaderExistsCondition.class)
    public Reader reader(Message message){
        return new Reader(message);
    }
}

설정 조건은, 구성 파일에서이 이름이 있는지 여부를 알아내는 reader방법이있는 경우, 구성 특성 matches콩의 조건을 만들기 위해 설정 될, true를 돌려줍니다.

package com.yww;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class ReaderExistsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment env = context.getEnvironment();
        return env.containsProperty("reader");
    }

}

부록 : 인터페이스 조건

Condition인터페이스의 소스 코드는 아래 하나가 들어 matches메소드가 리턴하는 경우, 방법을 true빈을 생성 조건을 만족시킬 것, false즉이 만들어지지 않습니다.

@FunctionalInterface
public interface Condition {

    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);

}

ConditionContext당신은 인터페이스 콩, 환경 변수, 자원 및 클래스를 확인할 수 있습니다.

AnnotatedTypeMetadata인터페이스는 확인할 수 있습니다 @Bean어떤 다른 음 주석 방법에 관한 것이다.

모호함 자동 조립 공정

동일한 유형의 빈의 복수가 생성되면, 컴포넌트는 주사 어셈블리에 의해 선택 될 수 없다.

봄이 발생합니다 NoUniqueBeanDefinitionException.

솔루션

두 가지 처리 방법이 있습니다 :

  • 에서 @Component또는 @Bean의 사용에 @Primary주석, 모호함의 얼굴에, 선호하는 빈을 선택합니다.
  • 에서 @Autowired또는 @Inject사용에 @Qualifier빈을 정의가 주입된다 ID. 받는 메모를 할 때 @Component, 또는 @Bean때, 그것은 자신의 규정을 만드는 것입니다 (유사한 빈 ID로 개명).

@Qualifier콩과 비슷한 제공 이름 태그를 정의, 스프링로드는 빈 태그를 만날 것입니다.

복수의 태그를 설정하려면, 당신은 당신의 자신의 주석을 정의 할 수 있습니다 @Qualifier사용자 정의 레이블 주석이 정의와 같은 인터페이스를. (자바 8 주석을 추가 할 수있는 정의 할 수 있습니다 @Repeatable코멘트를 반복 달성하기 위해,하지만 봄이되어 @Qualifier이 반복 주석에 추가되지 않습니다.)

부록 : 요소 별명과 byType와

일반적으로, 비록 콩 및 주입 파라미터가없는 (빈 이름 여기서 동일한 작성된 message1및 파라미터의 이름 message), 그러나 스프링 것이다 byType조립 빈의 동일한 종류를 찾는 방법.

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class ReaderConfig {

    @Bean
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---1");
        return message;
    }

    @Bean
    public Reader reader(Message message){
        return new Reader(message);
    }
}

콩의 여러 다른 유형이있을 때, 당신은에 의존 할 수 없다 byType(여기 매개 변수 이름을 사용하는 매개 변수에 전달 이름을 변경하여, 해당 빈을 찾기 위해 message2)의 사용을 byName지정 콩을.

package com.yww;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class ReaderConfig {

    @Bean
    public Message message1(){
        Message message = new Message();
        message.setMsg("---hi---1");
        return message;
    }

    @Bean
    public Message message2(){
        Message message = new Message();
        message.setMsg("---hi---2");
        return message;
    }

    @Bean
    public Reader reader(Message message2){
        return new Reader(message2);
    }
}

외부 값 주입

환경 값은 세 가지 방법으로 얻을 수 있습니다 :

  • 주입하여 Environment.
  • 자리 표시 자 속성 (속성 자리).
  • 스프링 표현 언어 SpEL.
#src/main/resources/application.properties
info.message=this is a message.
info.counter=10

환경:

import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;

@Component
@PropertySource("application.properties")
public class Message {

    @Autowired
    Environment env;

    public void print(){
        String msgStr = env.getProperty("info.message", "this is a msg");
        int msgInt = env.getProperty("info.counter", Integer.class, 30);
    }

}

속성 표시 :

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("application.properties")
public class Message {
    @Value("${info.message}")
    private String msg;
}

봄 EL :

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("application.properties")
public class Message {
    @Value("#{systemProperties['info.message']}")
    private String msg;
}

추천

출처www.cnblogs.com/maplesnow/p/11628735.html