Spring 基于注解装配Bean

傷城~ 2022-02-09 12:21 482阅读 0赞

文章目录

    • Spring 基于注解的配置
      • 创建Bean
      • 依赖注入
        • 普通值注入
        • 引用值注入
        • 生命周期
        • 作用域

Spring 基于注解的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入。而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。

  • 注解:就是一个类,使用@注解名称
  • 开发中:使用注解 取代 xml配置文件。

创建Bean

@Component取代<bean class="">
@Component(“id”) 取代 <bean id="" class="">

web开发,提供3个@Component注解衍生注解(功能一样)取代<bean class="">

  • @Repository :dao层
  • @Service:service层
  • @Controller:web层

注解使用前提,添加命名空间,让spring扫描含有注解类

  • 配置

    1. <!-- 组件扫描,扫描含有注解的类 -->
    2. <context:component-scan base-package="com.cc.study.annotation"></context:component-scan>
  1. </beans>
  • schema命名空间
    在这里插入图片描述
  • User

    @Component(“userId”)
    public class User {

    1. private String username;
    2. private Address address;
    3. public String getUsername() {
    4. return username;
    5. }
    6. public void setUsername(String username) {
    7. this.username = username;
    8. }
    9. public Address getAddress() {
    10. return address;
    11. }
    12. public void setAddress(Address address) {
    13. this.address = address;
    14. }

    }

  • 测试

    @Test

    1. public void demo01(){
    2. String xmlPath = "annotation.xml";
    3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user = (User) applicationContext.getBean("userId");
    5. System.out.println(user);
    6. }

结果发现报错了,报错如下:

  1. java.lang.IllegalArgumentException
  2. at org.springframework.asm.ClassReader.<init>(Unknown Source)
  3. at org.springframework.asm.ClassReader.<init>(Unknown Source)
  4. at org.springframework.asm.ClassReader.<init>(Unknown Source)
  5. at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
  6. at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
  7. at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
  8. at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
  9. at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
  10. at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
  11. at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
  12. at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
  13. at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
  14. at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
  15. at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
  16. at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
  17. at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
  18. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
  19. at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
  20. at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
  21. at com.cc.study.annotation.TestAnnotation.demo01(TestAnnotation.java:16)
  22. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  23. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  24. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  25. at java.lang.reflect.Method.invoke(Method.java:498)
  26. at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
  27. at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
  28. at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
  29. at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
  30. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
  31. at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
  32. at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
  33. at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
  34. at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
  35. at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
  36. at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
  37. at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
  38. at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
  39. at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)
  40. at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
  41. at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)
  42. at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84)
  43. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  44. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  45. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  46. at java.lang.reflect.Method.invoke(Method.java:498)
  47. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

然后我试了一下把Spring的版本改成4.0,把JDK改为1.8即可

  1. <dependencies>
  2. <!-- 4个核心(beans、core、context、expression) -->
  3. <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  4. <dependency>
  5. <groupId>org.springframework</groupId>
  6. <artifactId>spring-context</artifactId>
  7. <version>4.2.0.RELEASE</version>
  8. </dependency>
  9. <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
  10. <dependency>
  11. <groupId>org.springframework</groupId>
  12. <artifactId>spring-beans</artifactId>
  13. <version>4.2.0.RELEASE</version>
  14. </dependency>
  15. <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-core</artifactId>
  19. <version>4.2.0.RELEASE</version>
  20. </dependency>
  21. <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-expression</artifactId>
  25. <version>4.2.0.RELEASE</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>junit</groupId>
  29. <artifactId>junit</artifactId>
  30. <version>4.7</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <plugins>
  35. <plugin>
  36. <groupId>org.apache.maven.plugins</groupId>
  37. <artifactId>maven-compiler-plugin</artifactId>
  38. <configuration>
  39. <source>1.8</source>
  40. <target>1.8</target>
  41. </configuration>
  42. </plugin>
  43. </plugins>
  44. </build>

测试结果:
在这里插入图片描述

依赖注入

依赖注入,给私有字段设置,也可以给setter方法设置

普通值注入

使用@Value

  • User

    @Component(“userId”)
    public class User {

    1. @Value("Kevin")
    2. private String username;
    3. private Address address;
    4. public String getUsername() {
    5. return username;
    6. }
    7. public void setUsername(String username) {
    8. this.username = username;
    9. }
    10. public Address getAddress() {
    11. return address;
    12. }
    13. public void setAddress(Address address) {
    14. this.address = address;
    15. }

    }

  • 测试

    @Test

    1. public void demo02(){
    2. String xmlPath = "annotation.xml";
    3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user = (User) applicationContext.getBean("userId");
    5. System.out.println(user.getUsername());
    6. }

在这里插入图片描述

引用值注入

方式1:按照【类型】注入
@Autowired

  • Address

    @Component
    public class Address {

    1. @Value("北京")
    2. private String addr;
    3. @Value("112")
    4. private String tel;
    5. public String getAddr() {
    6. return addr;
    7. }
    8. public void setAddr(String addr) {
    9. this.addr = addr;
    10. }
    11. public String getTel() {
    12. return tel;
    13. }
    14. public void setTel(String tel) {
    15. this.tel = tel;
    16. }

    }

  • User

    @Component(“userId”)
    public class User {

    1. @Value("Kevin")
    2. private String username;
    3. @Autowired
    4. private Address address;
    5. public String getUsername() {
    6. return username;
    7. }
    8. public void setUsername(String username) {
    9. this.username = username;
    10. }
    11. public Address getAddress() {
    12. return address;
    13. }
    14. public void setAddress(Address address) {
    15. this.address = address;
    16. }

    }

  • 测试

    @Test

    1. public void demo03(){
    2. String xmlPath = "annotation.xml";
    3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user = (User) applicationContext.getBean("userId");
    5. System.out.println(user.getUsername());
    6. System.out.println(user.getAddress().getAddr());
    7. System.out.println(user.getAddress().getTel());
    8. }

在这里插入图片描述

方式2:按照【名称】注入1
@Autowired
@Qualifier(“名称”)

  • Address

    @Component(“addressId”)
    public class Address {

    1. @Value("北京")
    2. private String addr;
    3. @Value("112")
    4. private String tel;
    5. public String getAddr() {
    6. return addr;
    7. }
    8. public void setAddr(String addr) {
    9. this.addr = addr;
    10. }
    11. public String getTel() {
    12. return tel;
    13. }
    14. public void setTel(String tel) {
    15. this.tel = tel;
    16. }

    }

  • User

    @Component(“userId”)
    public class User {

    1. @Value("Kevin")
    2. private String username;
    3. @Autowired
    4. @Qualifier("addressId")
    5. private Address address;
    6. public String getUsername() {
    7. return username;
    8. }
    9. public void setUsername(String username) {
    10. this.username = username;
    11. }
    12. public Address getAddress() {
    13. return address;
    14. }
    15. public void setAddress(Address address) {
    16. this.address = address;
    17. }

    }

  • 测试

    @Test

    1. public void demo03(){
    2. String xmlPath = "annotation.xml";
    3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user = (User) applicationContext.getBean("userId");
    5. System.out.println(user.getUsername());
    6. System.out.println(user.getAddress().getAddr());
    7. System.out.println(user.getAddress().getTel());
    8. }

在这里插入图片描述

方式3:按照【名称】注入2
@Resource(name=“名称”)

  • User

    @Component(“userId”)
    public class User {

    1. @Value("Kevin")
    2. private String username;
    3. @Resource(name = "addressId")
    4. private Address address;
    5. public String getUsername() {
    6. return username;
    7. }
    8. public void setUsername(String username) {
    9. this.username = username;
    10. }
    11. public Address getAddress() {
    12. return address;
    13. }
    14. public void setAddress(Address address) {
    15. this.address = address;
    16. }

    }

  • 测试

    @Test

    1. public void demo03(){
    2. String xmlPath = "annotation.xml";
    3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user = (User) applicationContext.getBean("userId");
    5. System.out.println(user.getUsername());
    6. System.out.println(user.getAddress().getAddr());
    7. System.out.println(user.getAddress().getTel());
    8. }

在这里插入图片描述

生命周期

初始化:@PostConstruct
销毁:@PreDestroy

  • User

    @Component(“userId”)
    public class User {

    1. @Value("Kevin")
    2. private String username;
    3. @Resource(name = "addressId")
    4. private Address address;
    5. public String getUsername() {
    6. return username;
    7. }
    8. public void setUsername(String username) {
    9. this.username = username;
    10. }
    11. public Address getAddress() {
    12. return address;
    13. }
    14. public void setAddress(Address address) {
    15. this.address = address;
    16. }
    17. @PostConstruct
    18. public void init(){
    19. System.out.println("初始化");
    20. }
    21. @PreDestroy
    22. public void destroy(){
    23. System.out.println("销毁");
    24. }

    }

  • 测试

    @Test

    1. public void demo04(){
    2. String xmlPath = "annotation.xml";
    3. AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user = (User) applicationContext.getBean("userId");
    5. System.out.println(user.getUsername());
    6. System.out.println(user.getAddress().getAddr());
    7. System.out.println(user.getAddress().getTel());
    8. applicationContext.close();
    9. }

在这里插入图片描述

作用域

@Scope(“prototype”) 多例

  • User

    @Component(“userId”)
    @Scope(“prototype”)
    public class User {

    1. @Value("Kevin")
    2. private String username;
    3. @Resource(name = "addressId")
    4. private Address address;
    5. public String getUsername() {
    6. return username;
    7. }
    8. public void setUsername(String username) {
    9. this.username = username;
    10. }
    11. public Address getAddress() {
    12. return address;
    13. }
    14. public void setAddress(Address address) {
    15. this.address = address;
    16. }
    17. @PostConstruct
    18. public void init(){
    19. System.out.println("初始化");
    20. }
    21. @PreDestroy
    22. public void destroy(){
    23. System.out.println("销毁");
    24. }

    }

  • 测试

    @Test

    1. public void demo05(){
    2. String xmlPath = "annotation.xml";
    3. AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
    4. User user1 = (User) applicationContext.getBean("userId");
    5. User user2 = (User) applicationContext.getBean("userId");
    6. System.out.println(user1);
    7. System.out.println(user2);
    8. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,482人围观)

还没有评论,来说两句吧...

相关阅读