Spring 상용 주해 해석

11176 단어 스프링spring
1. 상용 주해
1.1 @Configuration
@Configuration
public class MainConfig {
}

@ Configuration 설명 에 따 르 면 이 종 류 는 설정 클래스 입 니 다. 이 종 류 는 Spring 응용 컨 텍스트 에 bean 을 만 드 는 방법 에 대한 세부 사항 을 포함 해 야 합 니 다.
1.2 @ComponentScan
@Configuration
@ComponentScan("per.ym")
public class MainConfig {
}

@ Componentscan 주 해 는 구성 요소 스 캔 을 사용 합 니 다. xml 에 설정 되 어 있 습 니 다.위 설정 은 per. ym 패키지 의 모든 종 류 를 스 캔 합 니 다. value 값 을 설정 하지 않 으 면 설정 류 가 있 는 가방 을 기본 패키지 (base package) 로 구성 요 소 를 스 캔 합 니 다.여러 가방 을 동시에 스 캔 하고 싶다 면 이렇게 설정 할 수 있 습 니 다.
@Configuration
@ComponentScan("per.ym, per.mm")
public class MainConfig {
}

위의 예 에서 설정 한 기본 패 키 지 는 String 형식 으로 표 시 됩 니 다.나 는 이것 이 가능 하 다 고 생각 하지만, 이런 방법 은 유형 이 안전 하지 않다 (not type - safe).코드 를 재 구성 하면 지정 한 기본 패키지 에 오류 가 발생 할 수 있 습 니 다.가방 을 간단 한 String 형식 으로 설정 하 는 것 외 에 @ Componentscan 은 가방 에 포 함 된 클래스 나 인터페이스 로 지정 하 는 또 다른 방법 을 제공 합 니 다.
@Configuration
@ComponentScan(basePackageClasses = {MyService.class,  MyDao.class})
public class MainConfig {
}

가방 에 스 캔 을 위 한 빈 태그 인터페이스 (marker interface) 를 만 드 는 것 을 고려 할 수 있 습 니 다.인 터 페 이 스 를 표시 하 는 방식 을 통 해 재 구성 에 우호 적 인 인터페이스 인용 을 유지 할 수 있 지만 실제 응용 프로그램 코드 를 참조 하 는 것 은 피 할 수 있 습 니 다.
1.3 @Controller, @Service, @ Repository, @Component
이 몇 개 는 자 연 스 럽 게 말 할 필요 도 없 이 가장 많이 본 셈 이다. 잠 금 장식 류 는 spring 용기 에 스 캔 되면 spring 관리 에 들 어 갈 것 이다.
@ Controller 대응 표현 층 의 Bean
@ Service 에 대응 하 는 것 은 비 즈 니스 층 Bean 입 니 다.
@ Repository 대응 데이터 액세스 층 Bean
@ Component, 상기 3 중 을 명확 하 게 선택 하지 못 하면 이 걸 로 하 세 요.
Spring 응용 컨 텍스트 의 모든 bean 은 하나의 ID 를 지정 합 니 다. 명확 하 게 지정 되 지 않 으 면 Spring 은 클래스 이름 에 따라 하나의 ID 를 지정 합 니 다. 즉, 클래스 이름 의 첫 번 째 자 모 를 소문 자로 바 꾸 는 것 입 니 다.이렇게 표시 할 수 있 는 ID:
@Component("ymm")
public class Person() {
}

Spring 은 @ Named (Java 의존 주입 규범 에서 제공 하 는) 를 @ Component 주해 의 대체 방안 으로 지원 합 니 다.둘 사이 에는 약간의 차이 가 있 지만 대부분의 장면 에서 그들 은 서로 바 꿀 수 있다.
1.4 @Bean
@ Bean 주 해 는 Spring 에 게 이 방법 을 알려 줍 니 다. 이 대상 은 Spring 응용 컨 텍스트 의 bean 으로 등록 해 야 합 니 다.방법 체 에는 최종 적 으로 bean 인 스 턴 스 를 만 드 는 논리 가 포함 되 어 있다.
@Configuration
public class MainConifg {
    @Bean
    public BookDao bookDao(){
        return new BookDao();
    }
}

@ Bean 주 해 는 Spring 에 게 이 방법 을 알려 줍 니 다. 이 대상 은 Spring 응용 컨 텍스트 의 bean 으로 등록 해 야 합 니 다.방법 체 에는 최종 적 으로 bean 인 스 턴 스 를 만 드 는 논리 가 포함 되 어 있다.
기본적으로 bean 의 ID 는 @ Bean 주석 이 있 는 방법 명 과 같 습 니 다.상례 에서 비 안의 이름 은 북 다 오 가 될 것 이다.다른 이름 으로 설정 하고 싶다 면 이름 을 바 꿀 수도 있 고 name 속성 을 통 해 다른 이름 을 지정 할 수도 있 습 니 다.
@Configuration
public class MainConifg {
    @Bean(" ymBookDao")
    public BookDao bookDao(){
        return new BookDao();
    }
}

이렇게 초기 화 방법 과 소각 방법 을 설정 할 수 있 습 니 다.
@Configuration
public class MainConifg {
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public BookDao bookDao(){
        return new BookDao();
    }
}

이것 은 xml 에 init - method = "init" destroy - method = "destory" 를 설정 하 는 것 과 같 습 니 다.
1.5 @Autowired
@ Autowired 주 해 를 통 해 spring 의 자동 조립 을 실현 할 수 있 습 니 다. 자동 조립 은 Spring 이 bean 의존 을 자동 으로 만족 시 키 는 방법 입 니 다. 의존 을 만족 시 키 는 과정 에서 Spring 응용 컨 텍스트 에서 특정한 bean 수요 에 맞 는 다른 bean 을 찾 습 니 다.
@Service
public class BookService {

    @Autowired(required=false)
    private BookDao bookDao;

}

속성, 구조 기, setter 방법 에 @ Autowired 를 표시 할 수 있 습 니 다.실제로 Setter 방법 은 특별한 점 이 없습니다. @ Autowired 주 해 는 클래스 의 어떤 방법 에 도 사용 할 수 있 습 니 다.
spring 은 자체 적 으로 @ Autowired 를 제외 하고 자바 규범 중의 @ Resource (JSR 250) 와 @ Inject (JSR 330) 를 지원 합 니 다. 이들 의 차 이 는 다음 과 같 습 니 다.
@Autowired:
a. 기본 값 은 용기 에서 해당 하 는 구성 요 소 를 찾 습 니 다. applicationContext. getBean (BookDao. class) 이 있 고 하나의 bean 만 의존 수요 에 맞 으 면 이 bean 은 조립 됩 니 다.같은 유형의 구성 요 소 를 여러 개 찾 으 면 속성 이름 을 구성 요소 의 id 로 용기 에서 applicationContext. getBean ("bookDao") 을 찾 습 니 다.
b, @ Qualifier ("bookDao"): 속성 명 대신 @ Qualifier 를 사용 하여 설치 할 구성 요소 의 id 를 명 확 히 지정 합 니 다.
c. 자동 조립 기본 값 은 반드시 속성 을 할당 해 야 합 니 다. 없 으 면 잘못 보고 합 니 다.@ Autowired (required = false) 를 사용 할 수 있 습 니 다.
d, @ Primary: Spring 을 자동 으로 조립 할 때 기본 값 으로 선 호 하 는 bean 을 사용 합 니 다.@ Qualifier 를 사용 하여 설치 할 bean 의 이름 을 지정 할 수도 있 습 니 다.
@Resource:
a. @ Autowired 와 마찬가지 로 자동 조립 기능 을 실현 합 니 다.기본 값 은 구성 요소 이름 에 따라 조립 합 니 다.
b. @ Primary 기능 은 지원 되 지 않 습 니 다.
c. required = false 기능 은 지원 되 지 않 습 니 다.
@Inject:
a. @ Autowired 와 마찬가지 로 자동 조립 기능 을 실현 합 니 다.
b. required = false 기능 은 지원 되 지 않 습 니 다.
가능 한 예:
@Configuration
@ComponentScan("per.ym.service")
public class MainConifgOfAutowired {

    @Primary
    @Bean("bookDao1")
    public BookDao bookDao1(){
        BookDao bookDao = new BookDao();
        bookDao.setLable("1");
        return bookDao;
    }

   @Bean("bookDao2")
   public BookDao bookDao2(){
     BookDao bookDao = new BookDao();
     bookDao.setLable("2");
     return bookDao;
   }
}   

@Service
public class BookService {

    @Qualifier("bookDao1")
    @Autowired(required=false)
    private BookDao bookDao;

    //@Resource(name="bookDao2")
    //private BookDao bookDao;

    //@Qualifier("bookDao2")
    //@Inject
    //private BookDao bookDao;
}

public class BookDao {

    private String lable = "0";

    public String getLable() {
        return lable;
    }

    public void setLable(String lable) {
        this.lable = lable;
    }
}

1.6 @Import
가 져 오 는 방식 으로 용기 에 구성 요 소 를 빠르게 가 져 옵 니 다. 그 위 에 일반 bean, ImportSelector, ImportBean Definition Registrar 등 3 가지 유형의 값 을 설정 할 수 있 습 니 다.특히 @ Configuration 주석 으로 수 정 된 bean 을 가 져 올 수 있 습 니 다. 이것 은 spring 프로필 에서 다른 프로필 을 가 져 올 때 와 비슷 합 니 다.
@Configuration
@Import({MainConfig2.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig {
}

MainConfig 2 는 다른 설정 클래스 나 일반적인 bean 일 수 있 습 니 다.
@Configuration
public class MainConfig2 {

    @Bean
    public Person person(){
        return new Person();
    }
}

ImportSelector, selectImports 방법 으로 되 돌아 오 는 배열 에는 용 기 를 가 져 올 bean 의 모든 클래스 이름 이 포함 되 어 있어 야 합 니 다.
public class MyImportSelector implements ImportSelector {

    //   ,               
    //AnnotationMetadata:    @Import           
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //      null ,    NPE
        return new String[]{"per.ym.bean.Car","per.ym.bean.Dog"};
    }

}

ImportBeanDefinitionRegistrar, BeanDefinitionRegistry. registerBeanDefinition 수 동 등록 용기 에 추가 할 bean 을 호출 합 니 다.
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * AnnotationMetadata:        
     * BeanDefinitionRegistry:BeanDefinition   ;
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //  Bean    
        RootBeanDefinition beanDefinition = new RootBeanDefinition(Red.class);
        //    Bean,  bean 
        registry.registerBeanDefinition("red", beanDefinition);
    }

}

1.7 @Conditional
클래스 에 놓 으 면 조건 이 만족 할 때 이 클래스 에 설 정 된 모든 bean 등록 이 유효 합 니 다.
방법 에 놓 고 조건 을 만족 시 킬 때 만 용기 에 현재 bean 을 등록 합 니 다.
@Conditional({WindowsCondition.class})
@Configuration
public class MainConfig {

    @Conditional(LinuxCondition.class)
    @Bean("linus")
    public Person person(){
        return new Person("linus");
    }
}

/**
* ConditionContext:           (  )
* AnnotatedTypeMetadata:    
*/
//    windows  
public class WindowsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //1、    ioc   beanfactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();

        //2、      
        ClassLoader classLoader = context.getClassLoader();

        //3、   bean      
        BeanDefinitionRegistry registry = context.getRegistry();

        //4、        
        Environment environment = context.getEnvironment();

        String property = environment.getProperty("os.name");
        if(property.contains("Windows")){
            return true;
        }

        return false;
    }

}

1.8 @Profile
현재 환경 에 따라 일련의 구성 요소 의 기능 을 동적 으로 활성화 하고 전환 합 니 다.구성 요소 가 어느 환경 에서 만 용기 에 등록 되 는 지 지정 합 니 다. 지정 하지 않 으 면 어떤 환경 에서 도 이 구성 요 소 를 등록 할 수 있 습 니 다.
환경 표 지 를 추가 한 bean 은 이 환경 이 활성화 되 었 을 때 만 용기 에 등록 할 수 있 습 니 다.
설정 클래스 에 쓰 여 있 습 니 다. 지정 한 환경 일 때 만 전체 설정 클래스 의 모든 설정 이 적 용 됩 니 다.
@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile implements EmbeddedValueResolverAware{

    @Value("${db.user}")
    private String user;

    private StringValueResolver valueResolver;

    private String  driverClass;

    @Profile("test")
    @Bean("testDataSource")
    public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Profile("dev")
    @Bean("devDataSource")
    public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev");
        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Profile("prod")
    @Bean("prodDataSource")
    public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/prod");

        dataSource.setDriverClass(driverClass);
        return dataSource;
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        this.valueResolver = resolver;
        driverClass = valueResolver.resolveStringValue("${db.driverClass}");
    }

}

db.properties:

db.user=root
db.password=123456
db.driverClass=com.mysql.jdbc.Driver

시작 명령 줄 에 환경 매개 변 수 를 설정 합 니 다:
-Dspring.profiles.active=test

코드 방식 설정:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfProfile.class);
applicationContext.getEnvironment().setActiveProfiles("dev");

좋은 웹페이지 즐겨찾기