>Java >java지도 시간 >Spring 프레임워크 주석의 사용 코드 예제에 대한 자세한 설명

Spring 프레임워크 주석의 사용 코드 예제에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-18 10:36:251892검색

앞에 적음:

우리 모두 알고 있듯이 JavaEE 개발 프레임워크에서는 Spring 프레임워크가 가장 많이 사용되고 프레임워크 내에서 주석의 위치가 점점 더 다양해지고 있습니다. 더 분명합니다. 농담을 해보자. 하나의 주석으로 해결할 수 있다면 여러 구성과 코드로는 결코 해결되지 않을 것이다. 해결할 수 없다면 두 개의 주석을 붙여라. ..)

1.@Component는 Spring에서 정의한 일반 주석으로 모든 Bean에 주석을 달 수 있습니다.

2. @Scope는 Bean의 범위를 정의합니다. 기본 범위는 "싱글톤"입니다. 또한 프로토타입, 요청, 세션 및 전역 세션이 있습니다.

사례: @Component 및 @Scope 사용 분석:

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 메서드로 이해됩니다.

사례: @Autowired 사용 분석 1:

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로 표시할 수 있는 생성자는 하나만 있을 수 있으며 하나만 있을 수 있다는 점에 주목할 가치가 있습니다. (참고: 필수 기본값은 거짓입니다).

사례: @Autowired 사용 분석 2:

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并赋值给当前类的成员变量

案例:@ImportResource和@Value用法分析:

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用法分析:

    @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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.