Spring 4 새로운 기능 - 핵심 용기 의 기타 개선

Spring 4 새로운 특성 - 범 형 한정 식 의존 주입
Spring 4 새로운 기능 - 핵심 용기 의 기타 개선
Spring 4 새로운 특성 - 웹 개발 의 강화
Spring 4 의 새로운 기능 - 통합 Bean Validation 1.1 (JSR - 349) 부터 SpringMVC 까지 
Spring 4 새로운 기능 - Groovy Bean 정의 DSL
Spring 4 새로운 기능 - 더 좋 은 자바 범 형 조작 API 
Spring 4 새로운 기능 - JSR 310 날짜 API 지원
Spring 4 새로운 기능 - 주석, 스 크 립 트, 작업, MVC 등 기타 기능 개선 
 
 
'스프링 4 의 새로운 특성 - 범 형 한정 식 의존 주입' 을 이 어 스프링 4 의 다른 개선 사항 을 살 펴 보 자.
 
1. 맵 의존 주입:
@Autowired
private Map<String, BaseService> map;

이렇게 주입: key 는 bean 이름 입 니 다.value 는 BaseService 를 실현 한 모든 Bean 입 니 다. 이전 편 을 사용 한 예 를 가정 하면 다음 과 같 습 니 다.
{organizationService=com.sishuok.spring4.service.OrganizationService@617029, userService=com.sishuok.spring4.service.UserService@10ac73b}
 
2. List / 배열 주입:
@Autowired
private List<BaseService> list;

 이렇게 하면 BaseService 를 실현 한 모든 Bean 을 주입 합 니 다.그러나 순 서 는 확실 하지 않다. 만약 우리 가 어떤 순서에 따라 얻 고 싶다 면.Spring 4 에서 @ Order 를 사용 하거나 Ordered 인 터 페 이 스 를 실현 할 수 있 습 니 다. 예 를 들 어:
@Order(value = 1)
@Service
public class UserService extends BaseService<User> {
}

이런 방식 은 다 형 이 필요 한 장면 에서 매우 유용 하 다.
 
3. @ Lazy 는 의존 주입 을 지연 시 킬 수 있 습 니 다.
@Lazy
@Service
public class UserService extends BaseService<User> {
}
@Lazy
    @Autowired
    private UserService userService;

 우 리 는 @ Lazy 를 @ Autowired 위 에 놓 을 수 있 습 니 다. 즉, 주입 에 의존 하 는 것 도 지연 되 는 것 입 니 다.우리 가 userService 를 호출 할 때 만 주입 할 수 있 습 니 다.지연 의존 주입 사용 시.@ Bean 에 도 적 용 됩 니 다.
 
4、@Conditional
@ conditional 은 @Profile( 、 、 , @ Profile 에서 각 환경의 설정 을 지정 한 다음 에 특정한 설정 을 통 해 특정한 환경 을 열 고 전환 하기 편리 합 니 다 . 그러나 @ conditional 의 장점 은 자신 이 규칙 을 정의 할 수 있다 는 것 입 니 다.@ Component, @ Bean, @ Configuration 등 주석 과 같은 클래스 에 절대 Bean 생 성 여부 등 을 지정 할 수 있 습 니 다.먼저 @ Profile 을 사용 하 는 사례 를 살 펴 보고 사용자 모듈 이 있다 고 가정 합 니 다.
1. 테스트 / 개발 기간 에 본 기계 의 아 날로 그 인 터 페 이 스 를 호출 하여 개발 하기에 편리 하 다.
2. 정식 기기 에 배치 할 때 원 격 인터페이스 로 바 꿉 니 다.
public abstract class UserService extends BaseService<User> {
}

@Profile("local")
@Service
public class LocalUserService extends UserService {
}

@Profile("remote")
@Service
public class RemoteUserService extends UserService {
}

테스트 용례 를 쓸 때 어떤 Profile 을 사용 할 지 지정 할 수 있 습 니 다.
@ActiveProfiles("remote")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =  "classpath:spring-config.xml")
public class ServiceTest {

    @Autowired
    private UserService userService;
}

  이런 방식 은 매우 간단 하 다.@ Profile 과 같은 주해 등 을 사용자 정의 하려 면 @ Conditional 이 도움 이 됩 니 다.만약 에 우리 시스템 에 로 컬 / 원 격 인터페이스 가 많다 고 가정 하면 우 리 는 두 개의 주 해 를 @ Local 과 @ Remote 주 해 를 사용 하 는 것 이 @ Profile 을 사용 하 는 것 보다 훨씬 편리 하 다 고 정의 합 니 다.예:
 
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Conditional(CustomCondition.class)
public @interface Local {
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Conditional(CustomCondition.class)
public @interface Remote {
}

 
public class CustomCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        boolean isLocalBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Local");
        boolean isRemoteBean = metadata.isAnnotated("com.sishuok.spring4.annotation.Remote");
        //  bean    @Local @Remote,  true,    Bean
        if(!isLocalBean && !isRemoteBean) {
            return true;
        }

        boolean isLocalProfile = context.getEnvironment().acceptsProfiles("local");

        //  profile=local   bean   @Local,   true     bean;
        if(isLocalProfile) {
            return isLocalBean;
        }

        //         @Remote     @Remote Bean
        return isRemoteBean;
    }
}

 
 그리고 우 리 는 이 두 개의 주 해 를 사용 하여 각각 우리 의 서 비 스 를 주해 합 니 다.
@Local
@Service
public class LocalUserService extends UserService {
}

 
@Remote
@Service
public class RemoteUserService extends UserService {
}

 
먼저 @ Local 과 @ Remote 주석 에 @ Conditional (CustomCondition. class) 이 지정 한 조건 을 사용 한 다음 @ Local 과 @ Remote 를 사용 하여 서 비 스 를 설명 합 니 다. 이렇게 서 비 스 를 불 러 올 때 조건 을 먼저 실행 한 다음 Bean 으로 불 러 올 지 여 부 를 판단 합 니 다. @Profile 은 이렇게 이 루어 졌 습 니 다. Condition 은 org. springframework. context. annotation. ProfileCondition 입 니 다.소스 코드 를 보 러 갈 수 있 습 니 다. 간단 합 니 다.
 
5. CGLIB 를 기반 으로 하 는 클래스 에이 전 트 는 클래스 에 빈 파 라 메 트릭 을 요구 하지 않 습 니 다.
이것 은 아주 좋 은 특성 입 니 다. 구조 기 를 사용 하여 주입 하면 좋 은 점 이 많 습 니 다. 예 를 들 어 Bean 을 만 들 때 만 의존 을 주입 한 다음 에 변 하지 않 습 니 다. setter 주입 을 사용 하면 다른 사람 이 고 칠 수 있 습 니 다.물론 우 리 는 spring 의 필드 단 계 를 사용 하여 주입 할 수 있다.만약 여러분 이 Shiro 와 같은 것 을 사용 한 적 이 있다 면, 우 리 는 Controller 에 대 리 를 해 야 할 것 입 니 다.클래스 에이전트 라면 컨트롤 러 에 빈 파 라 메 트릭 이 있어 야 하 며 귀 찮 을 때 도 있다.spring 은 어떻게 이 루어 졌 나 요?그 안에 obbenesis 라 이브 러 리 가 연결 되 어 있 으 며 이 를 통 해 이 루어 집 니 다. 홈 페이지 에 가서 소 개 를 볼 수 있 습 니 다.이렇게 하면 다음 과 같은 방식 의 구조 기 주입 을 지원 합 니 다.
 
@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
}

 
org. springframework. cglib. proxy. Enhancer 는 github 와 maven 창고 에 있 는 source 에 'github' 가 있 습 니 다.https://github.com/spring-projects/spring-framework/tree/master/spring-core/src/main/java/org/springframework/cglib;설마 잊 었 단 말 인가?
 

좋은 웹페이지 즐겨찾기