• Spring框架(3)---IOC装配Bean(注解方式)


    IOC装配Bean(注解方式)

    上面一遍文章Spring框架(2)---IOC装配Bean(xml配置方式)讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象

      注解方式需要在原先的基础上重新配置环境:

    (1)Component标签举例

    1:导入架包:

    这个包在spring开发包中就有,我测试了下,如果取消这个包,运行确实会报错:

    org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is 

     我只知道这个包是对于AOP起作用的,但我还是不知道这个包对于注解方面提供了怎样的帮助,大家如果知道,非常需要你的留言,谢谢!

    第二个配置:applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
             
             <!-- 配置注解bean所在的包 -->    
              <context:annotation-config/> <!--支持注解-->
              <!--自动扫描--> <!-- base-package放的是包名,有多个包名中间用逗号隔开 -->
              <context:component-scan base-package="com.study.spring.a_beandefinition"></context:component-scan>
    Component标签注入
    @Component("helloService")  
    //就相当于xml 文件中配置 <bean id="" class=""></bean> id="helloService" class就是当前类
    public class HelloService { 
    }
    HelloTest 测试类
     1 public class HelloTest {
     2     /*
     3      * 除了搭建环境和xml有点区别,其它方式一样
     4      */
     5     @Test
     6     public void demo1() {
     7         
     8         ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");
     9         
    10         HelloService helloService=(HelloService) applicationContext.getBean("helloService");
    11         
    12         System.out.println(helloService);
    13     }
    14     /*
    15      * 输出一个内存地址:com.study.spring.a_beandefinition.HelloService@1895c4c
    16      */
    17 }

     上面是一个最基本的Component注入的简单例子:

     除了@Component外,Spring提供了3个功能基本和@Component等效的注解

        @Repository  用于对DAO实现类进行标注
        @Service        用于对Service实现类进行标注
        @Controller   用于对Controller实现类进行标注
         ***** 三个注解为了后续版本进行增强的

     (2)bean属性的注入:

      普通属性 

    @Value(value="你好")
    private String info;

     对象属性

      对象属性有两种方法,他们是对等的

        /*
         * @Autowired:自动装配默认使用类型注入.
        * @Qualifier("userDao"):按名称进行注入.
         */
      @Autowired
      @Qualifier("userDao")    
     private UserDao userDao;
    @Resource(name="userDao")
    private UserDao userDao;

    Bean其他的属性的配置

        配置Bean初始化方法和销毁方法:init-method 和 destroy-method
        @PostConstruct 初始化
        @PreDestroy 销毁
      配置Bean的作用范围:@Scope("singleton")

    整体的举例:

     1 @Service(value="userService")
     2 @Scope("singleton")
     3 public class UserService {
     4   @Value(value="你好")
     5   private String info;
     6 
     7   @Resource(name="userDao")
     8   private UserDao userDao;
     9 
    10   public void sayHello(){
    11     System.out.println("Hello Spring Annotation..."+info);
    12   }
    13 
    14   @PostConstruct
    15   public void setup(){
    16     System.out.println("初始化...");
    17   }
    18 
    19   @PreDestroy
    20   public void teardown(){
    21     System.out.println("销毁...");
    22   }
    23 }

    Spring3.0提供使用Java类定义Bean信息的方法(用的很少)

     1 import org.springframework.context.annotation.Bean;
     2 import org.springframework.context.annotation.Configuration;
     3 
     4 /*
     5  * car和product领域对象类和相关属性我这里就不写了
     6  */
     7 @Configuration
     8 public class BeanConfig {
     9         
    10     //就相当于得到了当前的car对象
    11     @Bean(name="car")
    12     public Car initCar(){
    13         Car car =new Car();
    14         car.setName("法拉利");
    15         car.setPrice(6000000);
    16         return car;
    17     }
    18     //同样就相当于得到了product对象
    19     @Bean(name="product")
    20     public Product showProduct(){
    21         Product product =new Product();
    22         product.setPname("空调");
    23         product.setPnum(200);
    24         return product;
    25     }
    26 }

    测试类

     1 import org.junit.Test;
     2 import org.springframework.context.ApplicationContext;
     3 import org.springframework.context.support.ClassPathXmlApplicationContext;
     4 
     5 import com.study.spring.b_di.Car;
     6 import com.study.spring.b_di.Product;
     7 import com.study.spring.b_di.ScopeBean;
     8 import com.study.spring.c_di.CustomerService;
     9 
    10 public class SpringTest {
    11    
    12     //测试
    13     @Test
    14     public void demo2(){
    15         ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");
    16         
    17         Car car =(Car) applicationContext.getBean("car");
    18         System.out.println(car);
    19         
    20         Product product =(Product) applicationContext.getBean("product");
    21         System.out.println(product);
    22      /*
    23       * 输出结果:  
    24       *  Car [name=法拉利, price=6000000.0]
    25       *  Product [pname=空调, pnum=200]
    26       */
    27        //说明已经获得了方法返回的两个对象 
    28     }
    29 }

    (3)实际开发中使用XML还是注解?

      XML:有利于bean管理
       注解:注入属性的时候比较方便
       两种方式结合:一般使用XML注册Bean,使用注解进行属性的注入

    最后我找来一张图,用这张图来结尾本篇文章

    有不足之处,欢迎大家指点,谢谢!

  • 相关阅读:
    linux常用的基础知识
    【AW346】走廊泼水节
    【AW355】异象石
    【POJ3417】闇の連鎖
    【APIO2010】巡逻
    【SDOI2011】消防
    【BJWC2010】次小生成树
    【POJ3613】Cow Relays
    【POJ1734】Sightseeing trip
    【POJ1094】Sorting it all out
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/6513111.html
Copyright © 2020-2023  润新知