Spring注解

完全使用注解在开发中并不是特别多,但是在框架整合的时候往往会用到注解的方式。

IOC装配Bean(使用注解的方式):

Spring2.5中引入了使用注解去定义Bean:

@Component描述Spring框架中的Bean。

实例讲解注解

首先,

编写一个Dao

package com.js.demo1;
 
import org.springframework.stereotype.Repository;

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

编写一个bean

package com.js.demo1;
 
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
 * 注解的方式装配bean
 * @author hdb
 *
 */
//@Component("userService")
@Service("userService")
@Scope
public class UserService {
    @Value(value="小蒋")
    private String info;
    
//    @Autowired
//    @Qualifier("userDao")
    @Resource(name="userDao")
    private UserDao userDao;
    
    @Override
    public String toString() {
        return "UserService [info=" + info + ", userDao=" + userDao + "]";
    }
 
    public void sayHello(){
        System.out.println("Hello Spring annotation..."+info);
    }

    @PostConstruct
    public void setup(){
        System.out.println("初始化...");
    }
    @PreDestroy
    public void teardown(){
        System.out.println("销毁...");
    }

}

然后,修改applicationContext.xml(为什么还需要配置文件呢?是为了告诉Spring应该去哪些包下扫描使用注解配置的bean),配上xmlns:context:

<?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: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">
<context:annotation-config></context:annotation-config>
</beans>

接下来,配置context:component-scan,告诉Spring需要扫描哪些包:

<?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: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可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->
<context:annotation-config></context:annotation-config>
<!-- 配置扫描注解的包 -->
<context:component-scan base-package="com.js"></context:component-scan>
</beans>

编写测试类

package com.js.demo1;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class TestAnnotation {
    @Test
    public void demo1(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)applicationContext.getBean("userService");
        UserService userService2 = (UserService)applicationContext.getBean("userService");
        userService.sayHello();
        System.out.println("userService:"+userService);
        System.out.println("userService2:"+userService2);
        ((AbstractApplicationContext) applicationContext).close();
    }
}

@Component

除了@Component之外,Spring还提供了与之等效的三个注解(为了以后分层开发):

@Repository:用于对DAO实现类进行标注

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

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

普通属性(使用@Value注解):@Value

对象属性(使用@Autowired [ˈɔ:təʊwaɪəd]注解,默认使用类型注入):@Autowired

@Autowired可以带参数,required,默认为true,表示不忽略异常。

@Autowired(required=false)表示忽略异常。

@Qualifier(命名)ˈkwɒlɪfaɪə(r)]

一般情况下我们使用名称注入,也就是需要给UserDao的@Repository注解加上名称,

例如:@Repository("userDao"),然后在@Autowired注解下再加一个@Qualifier("userDao")去装配,注意名称要一致,否则注入失败

Spring默认使用类型注入,也就是此处的UserDao类型会默认匹配UserDao这个bean。

简言之,按名称注入:@Repository(命名)+@Autowired+@Qualifier(命名),按类型注入:@Repository+@Autowired

@Resource注解和@Autowired+@Qualifier(命名)功能有点类似:

例如上述例子中UserService中的注解:

@Autowired(required=false)
@Qualifier("userDao")
private UserDao userDao;

可以改写为:

@Resource(name="userDao")
private UserDao userDao;

运行同样成功。

Spring可以在创建和卸载bean的时候调用bean的两个生命周期方法:

<bean id="product" class="com.js.demo4.Product" init-method="setup" destroy-method="teardown"/>

这是之前我们采用xml配置的方式,采用注解方式可以实现同样的操作:

@PostConstruct:初始化
@PreDestroy:销毁
配置bean的作用范围:
用xml方式:
<bean id="customer" class="com.js.demo3.Customer" scope="prototype"></bean>
用注解方式:@Scope,默认值同样为:单例的
@Service("userService")
@Scope
public class UserService {
//        省略代码
}

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

XML:

* bean管理

注解;

* 注入属性的时候比较方便.

两种方式结合:一般使用XML注册Bean,使用注解进行属性的注入

在applicationContext.xml中配置

<!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->

<!-- 作用是使@Resource、@PostConstruct、@PreDestroy、@AutoWired生效-->

<context:annotation-config></context:annotation-config>

XML注册Bean,注解属性注入实例

首先,

编写一个Dao:

package com.js.demo4;

import org.springframework.stereotype.Repository;
 
@Repository("0rderDao")
public class OrderDao {
 
}
package com.js.demo4;

import org.springframework.stereotype.Repository;
 
@Repository("customerDao")
public class CustomerDao {
 
}

编写一个bean:

使用注解传入的属性就不在需要setter方法,也不再需要Component-scan

package com.js.demo4;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
 
public class CustomerService {
    //注解进行属性注入
    @Autowired
    @Qualifier("customerDao")
    private CustomerDao customerDao;
    
    @Autowired
    @Qualifier("orderDao")
    private OrderDao orderDao;
    
    @Override
    public String toString() {
        return "CustomerService [customerDao=" + customerDao + ", orderDao="
                + orderDao + "]";
    }
    
}

修改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: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可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->
<!-- 作用是使@Resource、@PostConstruct、@PreDestroy、@AutoWired生效-->
<context:annotation-config></context:annotation-config>

<bean id="customerDao" class="com.js.demo4.CustomerDao"></bean>
<bean id="orderDao" class="com.js.demo4.OrderDao"></bean>
<bean id="customerService" class="com.js.demo4.CustomerService">
</bean>

</beans>

编写测试类

package com.js.demo4;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestXmlAnnation {
    
    @Test
    public void demo(){
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml");
        CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
        System.out.println("customerService:"+customerService);
    }
}
posted @ 2018-08-15 17:54  Coosee  阅读(175)  评论(0编辑  收藏  举报