Spring之注解

 

时间:2017-2-1 00:40

 

——使用注解的方式装配Bean(IoC)

Spring2.5引入了使用注解来定义Bean的方式。

使用@Component注解来描述Spring框架中的Bean。

步骤:
    1)在配置文件中引入约束:xmlns:context="http://www.springframework.org/schema/context"
    2)在Bean上添加注解@Component(value="xxx"),value值为bean标签中的id属性。
    3)在配置文件中添加要扫描的包:<context:component-scan base-package="com.wyc.spring3.demo1"></context:component-scan>
    4)如果有多个包,可以使用逗号隔开
    5)可以写父目录,会自动包含子目录,例如:com.wyc

示例代码:

    /**
     * 使用注解的方式装配Bean
     * @author WYC
     *
     */
    // 在Spring配置文件中:<bean id="userService" class="com.wyc.demo1.UserService" />
    @Component("userService")
    public class UserService {
        public void sayHello(){
            System.out.println("Hello Spring Annotation");
        }
    }
 
----------------------------------------------------------------------------------------------------------------------------

配置文件:

xsi:schemaLocation="
 
    <context:component-scan base-package="com.wyc.spring3.demo1"></context:component-scan>

</beans>



除了使用@Component外,Spring还提供了三个功能基本和@Component等效的注解:
    1)@Repository
        用于对DAO实现类进行标注

    2)@Service
        用于对Service实现类进行标注

    3)@Controller
        用于对Controller实现类进行标注

    这三个注解是为了让标注类本身的用途清晰,进行分层开发,Spring在后续版本会对其进行增强。


——Bean的属性注入

1、普通属性
    直接使用@Value注解进行注入

    @Value(value="哈哈哈")
    private String info;

2、对象属性
    /*
     * Autowired自动装配,默认使用类型注入,required属性可以设置忽略异常,默认值为true,false为忽略,当程序出现错误,不会终止程序
     * 如果想根据名称注入,就使用Qualifier注解
     */
    @Autowired(required=false)
    @Qualifier("userDao")
    private UserDao userDao;

3、Spring提供对JSR-250中定义@Resource标准注解的支持
    @Resource注解有一个属性:
        *   name:
            如果不写,则相当于自动装配,功能与Autowired相同。
            如果指定name的属性,例如:@Resource(name="userDao"),则相当于@Qualifier("userDao");

4、示例代码:

// 在Spring配置文件中:<bean id="userService" class="com.wyc.demo1.UserService" />
@Component("userService")
public class UserService {
    @Value(value = "哈哈哈")
    private String info;
 
    /*
     * Autowired自动装配,默认使用类型注入,required属性可以设置忽略异常,false为忽略,当程序出现错误,不会终止程序
     * 如果想根据名称注入,就使用Qualifier注解
     */
    // @Autowired(required=false)
    // @Qualifier("userDao")
    @Resource(name = "userDao")
    private UserDao userDao;
 
    public void sayHello() {
        System.out.println("Hello Spring Annotation");
    }
 
    @Override
    public String toString() {
        return "UserService [info=" + info + ", userDao=" + userDao + "]";
    }
}

----------------------------------------------------------------------------------------------------------------------------

@Repository("userDao")
    public class UserDao {
 
}

——使用注解配置Bean的其他属性
 
1、配置Bean初始化方法和销毁方法
    *   init-method
        @PostConstruct

    *   destroy-method
        @PreDestroy

    示例代码:
        @PostConstruct
        public void init(){
            System.out.println("初始化方法");
        }
 
        @PreDestroy
        public void destory(){
            System.out.println("销毁方法");
        }

2、配置Bean的作用范围
    使用@Scope注解

    示例代码:
        @Scope(value="singleton")
        @Scope(value="prototype")
        public class UserService {
        }

——使用BeanConfig定义

使用Java类定义Bean
    在Spring3.0中,以JavaConfig为核心,提供使用Java类定义Bean信息的方法:
        *   @Configuration
            指定POJO类为Spring提供Bean定义信息。

        *   @Bean
            提供一个Bean定义信息。

示例代码:

BeanConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * 使用该类提供配置信息
 * @author WYC
 *
 */
@Configuration // Configuration表示这是一个配置类
public class BeanConfig {
    @Bean(name="car") // 相当于配置<bean name="car" class="..." />,最终会通过该方法的返回值得到一个Car类型实例。
    public Car initCar(){
        Car car = new Car();
        car.setName("奔驰");
        car.setPrice(2000000D);
        return car;
    }
 
    @Bean(name="product")
    public Product initProduct(){
        Product product = new Product();
        product.setName("空调");
        product.setPrice(8000D);
        return product;
    }
}

---------------------------------------------------------------------------------------------------------------------------

测试代码:

public void fun1(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Car car = (Car) context.getBean("car");
    Product product = (Product) context.getBean("product");
 
    System.out.println(car);
    System.out.println(product);


    图片


——XML和注解结合使用

XML:
    在Bean的管理层更加方便,结构层级清晰。

注解:
    在注入属性的时候比较方便,不需要提供set方法

步骤:
    1)引入context名称空间:
        <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    2)在配置文件中添加:
        <context:annotation-config />标签。
        目的是为了使@Resource、@PostConstruct、@Predestory、@Autowired、@Qualifier注解生效。

示例代码:

Bean:

public class CustomerService {
    @Autowired
    @Qualifier("customerDao")
    private CustomerDao customerDao;
    @Autowired
    @Qualifier("orderDao")
    private OrderDao orderDao;
}

----------------------------------------------------------------------------------------------------------------------------

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="
 
    <!-- 扫描包中类的注解,因为在配置文件中配置了Bean,所以不需要扫描 -->
    <!-- <context:component-scan base-package="com.wyc.spring3"></context:component-scan> -->
 
    <!-- 使@Autowired等注解生效 -->
    <context:annotation-config />
 
    <bean id="customerDao" class="com.wyc.spring3.demo3.CustomerDao" />
    <bean id="orderDao" class="com.wyc.spring3.demo3.OrderDao" />
    <bean id="customerService" class="com.wyc.spring3.demo3.CustomerService" />
</beans>

——总结

IoC装配Bean(注解)
    *   @Component,用于描述Spring框架中的Bean
    *   @Repository,用于对Dao实现类进行标注
    *   @Service,用于对Service实现类进行标注
    *   @Constroller,用于对Controller实现类进行标注

    *   DI属性注入
        >   普通属性
            @Value


        >   引用属性
            @Autowired
            @Qualifier
 
            @Resource

posted @ 2017-02-07 18:34  WWWYC  阅读(188)  评论(0编辑  收藏  举报