ご存知のとおり、JavaEE 開発フレームワークフレームワーク では、Spring フレームワークが最もよく使用されており、フレームワーク内でのアノテーションの位置付けがますます明確になってきています。冗談を言ってみましょう。1 つのアノテーションで解決できる場合は、大量の設定とコードを使用しても決して解決できません。解決できない場合は、2 つのアノテーションを使用してください (ちょっと待ってください。スプレーしないでください)。 .)
1. @Component は Spring であり、任意の Bean にアノテーションを付けることができるように定義された一般的なアノテーションです。
2.@Scope は Bean のスコープを定義します。デフォルトのスコープは「singleton」です。さらに、プロトタイプ、リクエスト、セッション、およびグローバル セッションがあります。
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 を使用できます。
super.getBean("beanAnnotation")
が IOC コンテナから Bean を取得し、Bean の Say メソッドを呼び出します。 ここでは、分析用に @Scope アノテーションを分離します。 TestBeanAnnotation クラスには testScpoe メソッドがあります。 BeanAnnotation クラスには myHashCode メソッドがあります。なぜ this.hashCode() を使用するのか、混乱しているかもしれません。 @Scope は Bean のスコープを指定するため、テスト クラスの結果が正確かつ明確であることを保証するために、ハッシュ コード値を使用してそれらが同じ オブジェクト
であるかどうかを判断します。
3.@Repository、@Service、@Controller は、よりターゲットを絞ったアノテーションです。
追記: ここで、これら 3 つのアノテーションは @Component によって定義されたアノテーションに基づいていることを理解する必要があります:
①、@Repository は通常、DAO クラスにアノテーションを付けるために使用されます。これは、私たちがよく永続層と呼ぶものです。 ②. @Service は通常、サービス層である Service クラスにアノテーションを付けるために使用されます。
MVC
)であるControllerクラスで使用されます。 4. @Autowired は、セッター メソッド、コンストラクター、またはメンバー変数で使用でき、Spring Bean の自動アセンブリを実行できる「従来の」セッター メソッドとして理解されます。ケース: @Autowired 使用分析 1:
Spring 構成ファイル → spring-beanannotation.xml: <context:component-scan base-package="com.beanannotation"></context:component-scan>
<context:component-scan base-package="com.beanannotation"></context:component-scan>
BeanImplOne クラス:
public class SimpleMovieLister { private MovieFinder movieFinder; @Autowired(required=false) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
@Order @Component public class BeanImplOne implements BeanInterface { }
@Order @Component public class BeanImplTwo implements BeanInterface { }
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并赋值给当前类的成员变量
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(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 サイトの他の関連記事を参照してください。