우리 모두 알고 있듯이 JavaEE 개발 프레임워크에서는 Spring 프레임워크가 가장 많이 사용되고 프레임워크 내에서 주석의 위치가 점점 더 다양해지고 있습니다. 더 분명합니다. 농담을 해보자. 하나의 주석으로 해결할 수 있다면 여러 구성과 코드로는 결코 해결되지 않을 것이다. 해결할 수 없다면 두 개의 주석을 붙여라. ..)
1.@Component는 Spring에서 정의한 일반 주석으로 모든 Bean에 주석을 달 수 있습니다.
2. @Scope는 Bean의 범위를 정의합니다. 기본 범위는 "싱글톤"입니다. 또한 프로토타입, 요청, 세션 및 전역 세션이 있습니다.
BeanAnnotation 클래스:
@Scope @Component public class BeanAnnotation { public void say(String arg) { System.out.println("BeanAnnotation : " + arg); } public void myHashCode() { System.out.println("BeanAnnotation : " + this.hashCode()); } }
junit4 테스트 클래스→TestBeanAnnotation 클래스:
@RunWith(BlockJUnit4ClassRunner.class) public class TestBeanAnnotation extends UnitTestBase { public TestBeanAnnotation() { super("classpath*:spring-beanannotation.xml"); } @Test public void testSay() { BeanAnnotation bean = super.getBean("beanAnnotation"); bean.say("This is test."); } @Test public void testScpoe() { BeanAnnotation bean = super.getBean("beanAnnotation"); bean.myHashCode(); bean = super.getBean("beanAnnotation"); bean.myHashCode(); } }
Spring구성 파일→spring-beanannotation.xml:
<context:component-scan base-package="com.beanannotation"></context:component-scan>
Spring 구성 파일을 먼저 분석해 보겠습니다. base-package="com.beanannotation"
에서 설명합니다. 이 패키지 이름 아래의 주석만 처리됩니다.
그런 다음 BeanAnnotation 클래스를 분석하면 say 메소드가 있습니다. 이것이 어떤 클래스 유형인지(참고: Service 또는 DAO) 모른다고 가정하면 일반 주석 @Component를 사용할 수 있습니다.
마지막으로 TestBeanAnnotation 클래스를 분석합니다. testSay 메소드에서 super.getBean("beanAnnotation")
는 IOC 컨테이너에서 Bean을 검색하고 해당 Bean의 say 메소드를 호출합니다.
질문을 할 시간입니다. super.getBean을 사용할 때 해당 빈의 ID를 통해 IOC 컨테이너에서 가져옵니다. BeanAnnotation 클래스에 @Component를 추가하면 기본 ID는 beanAnnotation이기 때문입니다. @Component의 이름을 지정한 경우, 예를 들어 @Component(”bean”)
로 지정한 경우, 단위 테스트 시 super.getBean에서 얻은 id가 이에 대응해야 테스트가 성공합니다.
여기에서는 분석을 위해 @Scope 주석을 분리합니다. TestBeanAnnotation 클래스에 testScpoe 메서드가 있습니다. BeanAnnotation 클래스에 myHashCode 메소드가 있습니다. 왜 this.hashCode()를 사용합니까? @Scope는 Bean의 범위를 지정하므로 테스트 클래스의 결과가 정확하고 명확하도록 하기 위해 동일한 객체인지 여부를 해시 코드 값을 사용합니다.
3.@Repository, @Service 및 @Controller는 더욱 타겟팅된 주석입니다.
PS: 여기서는 이 세 가지 주석이 @Component로 정의된 주석을 기반으로 한다는 점을 이해해야 합니다.
①, @Repository는 일반적으로 다음 작업에 사용됩니다. 지속성 레이어라고 부르는 DAO 클래스에 주석을 답니다.
②. @Service는 일반적으로 서비스 계층인 Service 클래스에 주석을 추가하는 데 사용됩니다.
3. @Controller는 주로 컨트롤 레이어(MVC)인 Controller 클래스에서 사용됩니다.
4. @Autowired는 setter 메서드, 생성자 또는 멤버 변수에서 사용할 수 있고 Spring Bean의 자동 어셈블리를 수행할 수 있는 "전통적인" setter 메서드로 이해됩니다.
Spring 구성 파일 → spring-beanannotation.xml:
<context:component-scan base-package="com.beanannotation"></context:component-scan>
SimpleMovie Lister 클래스:
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired(required=false) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
기본적으로 적합한 Bean을 찾을 수 없으면 자동 배선이 실패합니다. 예외를 발생시킵니다. @Autowired 이 설정 메소드에 주석을 달고 이를 방지하려면 필수=false로 표시하세요. 그러나 이는 필요하지 않습니다. movieFinder 인스턴스를 찾을 수 없으면 예외가 발생하지 않습니다. 이 경우 movieFinder가 null인 것으로 확인됩니다. 사용할 때 먼저 movieFinder가 null인지 확인하세요. 그렇다면 null 포인터 예외가 보고됩니다.
각 클래스가 많은 생성자를 가질 수 있다는 것을 알고 있지만 @Autowired를 사용하는 경우 필수=true로 표시할 수 있는 생성자는 하나만 있을 수 있으며 하나만 있을 수 있다는 점에 주목할 가치가 있습니다. (참고: 필수 기본값은 거짓입니다).
BeanImplOne 클래스:
@Order @Component public class BeanImplOne implements BeanInterface { }
BeanImplTwo 클래스:
@Order @Component public class BeanImplTwo implements BeanInterface { }
BeanInterface 클래스:
public interface BeanInterface { }
BeanInvoker 클래스:
@Component public class BeanInvoker { @Autowired private List<BeanInterface> list; @Autowired private Map<String, BeanInterface> map; public void say() { if (null != list && 0 != list.size()) { for (BeanInterface bean : list) { System.out.println(bean.getClass().getName()); } } else { System.out.println(" list is null !"); } if (null != map && 0 != map.size()) { for (Map.Entry<String, BeanInterface> entry : map.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue().getClass().getName()); } } else { System.out.println("map is null !"); } } }
테스트 클래스 TestInjection:
@RunWith(BlockJUnit4ClassRunner.class) public class TestInjection extends UnitTestBase { public TestInjection() { super("classpath:spring-beanannotation.xml"); } @Test public void testMultiBean() { BeanInvoker invoker = super.getBean("beanInvoker"); invoker.say(); } }
首先,我们清楚BeanImplOne类和BeanImplTwo类是实现了BeanInterface接口的,在BeanInvoker类里面我们定义了list和map,我们通过@Autowired注解把BeanImplOne类和BeanImplTwo类注解进入其中。那么怎么证实是@Autowired注解把这两个类注入到list或者map中的呢?那么请看if循环语句和foreach循环打印,通过这个逻辑判断,如果能够打印出BeanImplOne类和BeanImplTwo类的路径名,就说明这样是可以的。如果有些小伙伴可能不信,那么可以试着不使用@Autowired注解,看结果怎么样。
测试类没有什么好说的,各位小伙伴有没有注意到@Order注解呢?这里需要解释的就是,如果在@Order注解里面输入执行的数字,比如1或者2,那么打印出来的路径名就会按顺序,也就是说通过指定@Order注解的内容可以实现优先级的功能。
5.@ImportResource注解引入一个资源,对应一个xml文件
6.@Value注解从资源文件中,取出它的key并赋值给当前类的成员变量
MyDriverManager类:
public class MyDriverManager { public MyDriverManager(String url, String userName, String password) { System.out.println("url : " + url); System.out.println("userName: " + userName); System.out.println("password: " + password); } }
config.xml:
<context:property-placeholder location="classpath:/config.properties"/>
StoreConfig类:
@Configuration @ImportResource("classpath:config.xml") public class StoreConfig { @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; @Bean public MyDriverManager myDriverManager() { return new MyDriverManager(url, username, password); }
这个案例我们使用注解配置jdbc数据库的连接,首先创建一个内含构造器的MyDriverManager类,然后配置config.xml里面的资源文件路径,以便@ImportResource注解获取,最后配置StoreConfig类。(注意url、username、password也必须要和数据库的保持一致哦)
详解StoreConfig类:首先我们定义三个成员变量,然后给每一个成员变量打上一个@value注解,注意@value里面的内容一定是资源文件里面的key值。这里的@ImportResource注解就是指明一个资源文件,在这个资源文件里面获取到对应的数据。那么@Configuration注解是用来干嘛的呢?为什么不用@Component注解呢?其实是这样的,@Component注解用于将所标注的类加载到 Spring 环境中,这时候是需要配置component-scan才能使用的,而@Configuration注解是Spring 3.X后提供的注解,它用于取代XML来配置 Spring。
7.@Bean注解用来标识配置和初始化一个由SpringIOC容器管理的新对象的方法,类似XML中配置文件的d7de7346c94b9644ec904d605d4c96bf
ps:默认的@Bean注解是单例的,那么有什么方式可以指定它的范围呢?所以这里才出现了@Scope注解
8.@Scope注解,在@Scope注解里面value的范围和Bean的作用域是通用的,proxyMode的属性是采用哪一种的单例方式(一种是基于接口的注解,一种是基于类的代理)
@Bean @Scope(value ="session",proxyMode = "scopedProxyMode.TARGET_CLASS") public UserPreferences userPreferences(){ return new userPreferences(); } @Bean public service userService(){ UserService service =new SimpleUserService(); service.setUserPreferences(userPreferences); return service; }
위 내용은 Spring 프레임워크 주석의 사용 코드 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!