Spring Frameworkのアノテーションの使用コード例を詳しく解説

黄舟
リリース: 2017-03-18 10:36:25
オリジナル
1827 人が閲覧しました

前に書きます:

ご存知のとおり、JavaEE 開発フレームワークフレームワーク では、Spring フレームワークが最もよく使用されており、フレームワーク内でのアノテーションの位置付けがますます明確になってきています。冗談を言ってみましょう。1 つのアノテーションで解決できる場合は、大量の設定とコードを使用しても決して解決できません。解決できない場合は、2 つのアノテーションを使用してください (ちょっと待ってください。スプレーしないでください)。 .)

1. @Component は Spring であり、任意の Bean にアノテーションを付けることができるように定義された一般的なアノテーションです。

2.@Scope は Bean のスコープを定義します。デフォルトのスコープは「singleton」です。さらに、プロトタイプ、リクエスト、セッション、およびグローバル セッションがあります。

ケース: @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:

りー

最初に Spring 構成ファイルを分析しましょう。 base-package="com.beanannotation" は、このパッケージ名のアノテーションのみを処理することを示しています。 base-package="com.beanannotation"说明我们只处理这个包名下面的注解。

然后分析BeanAnnotation类,有一个say的方法。假设我们不清楚这是一个什么类型(注:Service或者DAO)的类,我们可以用一个通用的注解@Component。

最后分析TestBeanAnnotation类,testSay方法里super.getBean("beanAnnotation")是从IOC的容器中取到这个bean,并调用bean的say方法。

提出问题的时间到了,当我们super.getBean的时候是通过bean的id从IOC容器中获取的,那么这个id是什么呢?因为在我们添加@Component到BeanAnnotation类上的时候,默认的id为beanAnnotation。如果指定了@Component的名称,譬如指定为@Component(”bean”)次に、BeanAnnotation クラスを分析すると、say メソッドがあります。これがどのようなタイプのクラス (注: Service または DAO) かわからないと仮定すると、一般的な注釈 @Component を使用できます。

最後に TestBeanAnnotation クラスを分析します。testSay メソッドで、super.getBean("beanAnnotation") が IOC コンテナから Bean を取得し、Bean の Say メソッドを呼び出します。

ここで質問します。super.getBean を使用すると、Bean の ID を通じて IOC コンテナから取得されます。 @Component を BeanAnnotation クラスに追加すると、デフォルト ID は beanAnnotation になるためです。 @Component の名前を指定した場合、例えば @Component("bean") と指定した場合、単体テスト時に super.getBean で取得した ID と照合してテストする必要があります。成功。

ここでは、分析用に @Scope アノテーションを分離します。 TestBeanAnnotation クラスには testScpoe メソッドがあります。 BeanAnnotation クラスには myHashCode メソッドがあります。なぜ this.hashCode() を使用するのか、混乱しているかもしれません。 @Scope は Bean のスコープを指定するため、テスト クラスの結果が正確かつ明確であることを保証するために、ハッシュ コード値を使用してそれらが同じ

オブジェクト
であるかどうかを判断します。

3.@Repository、@Service、@Controller は、よりターゲットを絞ったアノテーションです。

追記: ここで、これら 3 つのアノテーションは @Component によって定義されたアノテーションに基づいていることを理解する必要があります:

①、@Repository は通常、DAO クラスにアノテーションを付けるために使用されます。これは、私たちがよく永続層と呼ぶものです。 ②. @Service は通常、サービス層である Service クラスにアノテーションを付けるために使用されます。

③、@Controllerは通常、コントロール層(

MVC

)であるControllerクラスで使用されます。

4. @Autowired は、セッター メソッド、コンストラクター、またはメンバー変数で使用でき、Spring Bean の自動アセンブリを実行できる「従来の」セッター メソッドとして理解されます。

ケース: @Autowired 使用分析 1:

Spring 構成ファイル → spring-beanannotation.xml:

SimpleMovie

List

er クラス:

<context:component-scan base-package="com.beanannotation"></context:component-scan>
ログイン後にコピー
ログイン後にコピー
適切なものが見つからない場合、デフォルトで Beanこれを回避するには、この set メソッドに @Autowired アノテーションを付け、required=false をマークします。ただし、これは必要ありません。movieFinder のインスタンスが見つからない場合、例外はスローされません。この場合、movieFinder が null

であることが判明します。が null の場合、null ポインタ例外が報告されます。

各クラスが多くのコンストラクターを持つことができることはわかっていますが、@Autowired を使用する場合、required=true としてマークできるコンストラクターは 1 つだけです (注: required のデフォルト値は false です)。 。

ケース: @Autowired の使用分析 2:

BeanImplOne クラス:

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired(required=false)
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

}
ログイン後にコピー
BeanImplTwo クラス:

@Order
@Component
public class BeanImplOne implements BeanInterface {

}
ログイン後にコピー
BeanInterface クラス:

@Order
@Component
public class BeanImplTwo implements BeanInterface {

}
ログイン後にコピー
BeanInvoker クラス:

public interface BeanInterface {

}
ログイン後にコピー

テストクラス 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中配置文件的

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 Frameworkのアノテーションの使用コード例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!