선택권이 많으면 좋은 걸까요?
10년이 넘는 빠른 개발과 업데이트 끝에 Spring은 독특한 혁신과 더 많은 선택권을 제공하여 많은 팬을 확보했습니다! 예를 들어 스프링 빈 어셈블리(XML의 명시적 구성, Java의 명시적 구성, 암시적 빈 검색 메커니즘 및 자동 어셈블리), 주석의 다양화(기본 주석, jsr250, jsr330) 등이 있습니다!
이렇게 반복되는 선택이 많다는 게 정말 좋은 일일까요? 이는 또한 학습 및 마스터링 비용이 증가하여 마스터하기가 더 어려워진다는 것을 의미합니까?
비유를 들어보자. 봄이라는 정신병자는 의학을 공부하면 나라도 구할 수 있다고 말한다. 입대하여 나라를 다스리다(자바 표시) 구성), 포획 사격 연습에 성공하려 할 때 실제로는 더 간단하게 나라를 교육하고 구하는 방법(콩 자동 조립)이 있다고 알려준다!
초보자로서 개인적으로 서블릿을 배우는 것부터 JSP, Struts를 거쳐 지금의 Spring까지 점점 구덩이가 커지고 있다고 생각합니다!
더 이상 고민하지 않고 몇 가지 간단한 주석을 소개하겠습니다.
@Autowired 주석: 자동 조립을 실현합니다.
1. spring xml 구성 파일에 다음 두 클래스를 삽입해야 합니다.
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
2. testUtil 클래스에 testA 클래스를 어셈블하려면 다음을 사용하세요. testUtil 클래스 @Autowired 주석에 있습니다.
TestA를 TestUtil에 삽입하려는 경우 코드는 다음과 같습니다.
public class TestUtil{ @Autowired private Test testA; ....... }
간단히 말하면 자동 연결은 Spring이 자동으로 수행하는 방법입니다. 빈 종속성을 충족합니다. 종속성을 충족하는 과정에서 특정 빈의 요구 사항과 일치하는 다른 빈이 Spring 애플리케이션 컨텍스트에서 발견됩니다.
@Autowired 주석은 생성자뿐만 아니라 메서드 및 속성에도 사용할 수 있습니다. 일치하는 빈이 없으면 애플리케이션 컨텍스트가 생성될 때 Spring은 예외를 발생시킵니다. 예외를 방지하려면 @Autowired의 필수 속성을 false로 설정할 수 있습니다. 그러나 필수 속성을 false로 설정할 때는 주의해야 합니다. 코드에 null 검사가 없으면 이 어셈블되지 않은 속성으로 인해 NullPointerException이 발생할 수 있습니다.
@Autowired는 spring 전용 주석입니다. 자동 어셈블리 작업을 완료하기 위해 코드의 모든 곳에서 Spring 전용 주석을 사용하고 싶지 않다면 @Inject로 대체하는 것을 고려해 보세요.
자동 어셈블리에서 Spring은 @Inject(JSR330 주석)와 @Autowired를 모두 지원합니다. @Inject와 @Autowired 사이에는 약간의 미묘한 차이가 있지만 대부분의 시나리오에서는 서로 바꿔 사용할 수 있습니다.
참고: 1. 자동 조립만 제공하며 주입은 필수 조건이 아닙니다.
2. 자동 조립을 수행하려면
를 지원하거나
---------------를 사용할 수 있습니다. - ------------------------------------------------- - ------------------------------------------------- - ------------------------------------------------- - ----------------
@Qualifier 주석: 종속성 주입 조건을 제한합니다.
@Autowired 주석이 달린 종속성이 컨테이너에서 이에 해당하는 인스턴스 하나만 찾을 수 있으면 모든 것이 정상이지만 동일한 유형의 객체 인스턴스가 여러 개 있는 경우 @Qualifier 주석이 적용됩니다.
Test 클래스에 TestA와 TestB라는 두 가지 구현이 있는 경우 스프링 구성 파일의 구성 코드는 다음과 같습니다.
<beans> <bean id="testA" class="..../TestA" /> <bean id="testB" class="..../TestB" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
TestA를 TestUtil에 삽입하려는 경우 코드 다음과 같습니다.
public class TestUtil{ @Autowired @Qualifier("testA") private Test testA; private Test testB; ....... }
----------------------------------- ------ ------------------ ------ ------------------ ------ ------------------ ------ ------
@Resource (name="") 주석: 빈 주입을 구현합니다. 그 기능은 @Autowired 주석과 유사합니다.
1. 이 주석은 JSR250에서 도입되었으므로 사용하기 전에 jsr250 관련 jar 패키지 지원을 가져와야 합니다.
<!-- jsr250注解包的引入 --> <dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency>
2. 관련 클래스를 스프링 구성 파일에 삽입합니다.
testA 클래스를 testUtil 클래스에 도입해야 하는 경우 스프링 구성 파일의 구성 코드는 다음과 같습니다.
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans> 3.在 testUtil 中加入
@Resource (name=" ") 참고:
TestA를 TestUtil에 삽입하려는 경우 코드는 다음과 같습니다.
public class TestUtil{ @Resource(name=“testA”) private Test testA; private Test testB; ....... }
참고: @Resource의 이름( name="")은 주입될 객체를 지정하고, testA는 스프링 구성 파일에 정의된 Bean의 ID입니다.
4. 설명 주석이 포함된 다음 두 패키지 중 적어도 하나를 스프링 구성 파일에 도입해야 합니다. 개인적으로 컨텍스트 요소가 마음에 듭니다.
<context:annotation-config /> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
备注:JSR250注解有 @PostConstruct,@PreDestroy 。
JSR330注解有 @Inject (代替 @AutoWired)、@Named (代替 @Component)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ComponentScan(basePackages=“×××××”)注解:启用组件扫描基础包。
1.在 spring 配置文件中加入
配置完成后,
备注:加入该元素后,就不需要再向 spring 配置文件中注入相关的类,即不需要再使用如下配置:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
2.
@Component public class TestUtil{ @Autowired private Test testA; ....... } @Component public class TestA{ private int a; private String ss; ... }
备注:(1)需要在两个类中都标注 @Component 注解。
(2)该注解是类级别的,它添加在类之上。
(3)@Component("id号")注解:表明该类会作为组件类,并告知Spring要为这个类创建bean。若id号为空,则默认使用以小写开头的类名!若使用自定义id号,则在后续的引用中需要引入以该id为标记。