Spring的几种常用注解

                                                                    Spring几种常用的注解

 注解

说明

@Component

 

可以使用此注解描述Spring中的Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用的任何层次。使用时只需将该注解标注在相应类上即可。

@Repository

 

用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component相同。

@Service

 

通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。

@Controller

 

通常作用在控制层(如Spring MVC的Controller),用于将控制层的类标识为Spring中的Bean其功能与@Component相同。

@Autowired

 

用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。

 

@Resource

 

其作用与@Autowired一样。其区别在于@Autowired默认按Bean类型装配,而@Resource默认按照Bean实例名称进行装配。@Resource中有两个重要属性:name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。如果指定name属性,则按实例名称进行装配;如果指定type属性,则按Bean类型进行装配;如果都不指定,则先按Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配;如果都无法匹配,则抛出NoSuchBeanDefinitionException异常

@Qualifier

 

与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称由@Qualifier注解的参数指定。

 

 

测试demo1

1)创建一个dao接口,并在接口内定义一个方法

public interface UserDao {

    public void save();

}

实现这个dao接口

//使用@Repository注解将UserDaoPmpl标识为Spring中的Bean,

//其相当于  <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"/>

@Repository("userDao")

public class UserDaoImpl implements UserDao{

    @Override

    public void save() {

       // TODO Auto-generated method stub

        System.out.println("userDao.save");      

    }

}

其中@Repository注解相当于在spring容器中创建一个bean实例,即如下

<bean id="userDao" class="org.lyl.annotation.UserDaoImpl"/>

@Repository("userDao")注解中的userDao相当于<bean/>中的id的值。@Repository注解一般用于dao层,即数据访问层。在实现类UserDaoImpl中的save方法中添加一个打印输出。

 

2)创建一个service接口,并在接口内定义一个方法

public interface UserService {

    public void save();

}

实现这个service接口

**使用@Service注解将UserServiceImpl类标识为Spring中的Bean

 * 其相当于  <bean id="userService" class="org.lyl.annotation.UserServiceImpl"/>

 */

@Service("userService")

public class UserServiceImpl implements UserService{

    //使用Resource注解注入,按userDao实例名称进行注入

    //相当于<property name="useDao" ref="userDao"></property>

    @Resource(name="userDao")

    private UserDao userDao;

    public void save() {

       // TODO Auto-generated method stub

       this.userDao.save();

       System.out.println("执行UserServic.save");

    }

}

其中@Service注解相当于在spring容器中创建一个bean实例,即如下

<bean id="userService" class="org.lyl.annotation.UserServiceImpl"/>

@Service("userService")中的userService与bean对应关系同上,@Service注解一般用于service层,即业务逻辑层,一般业务逻辑就是在service层处理的;在实现类UserServiceImpl中的save方法中添加一个打印输出。

@Resourc注解<bean/>中的子元素<property/>,name相当于property中的name, @Service("userService")注解加@Resource(name="userDao")一起使用,等同于如下

<bean id="userService" class="org.lyl.annotation.UserServiceImpl">

   <property name="useDao" ref="userDao"></property>

</bean>

@Resource(name="userDao")注解按名称类型注入dao的实现类UserDaoImpl,即注解@Repository("userDao")中的实例化的bean

 

3)创建一个controller

 

@Controller("userController")

public class UserController {

    @Resource(name="userService")

    private UserService userService;

    public void save() {

       this.userService.save();

       System.out.println("运行UserController.save");

    }

}

@Controller注解将UserController标识为Spring中的bean

@Resource(name="userService")按名称将userService注入到controller中等同于

<bean id=" userController " class="org.lyl.annotation. UserController ">

   <property name=" userService " ref=" userService "></property>

</bean>

 

4)创建一个配置文件beans.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-4.3.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context-4.3.xsd ">

        <!-- 将指定类配置给spring,spring创建其对象的实例 -->

        <!-- 使用context命名空间在配置文件中开启相应的注解处理器 -->

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

        <!-- 分别定义3个实例 -->

        <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean>

        <bean id="userService" class="org.lyl.annotation.UserServiceImpl"></bean>

        <bean id="userController" class="org.lyl.annotation.UserController"></bean>

       

        <!-- 使用context命名空间通知spring扫描指定包下所有Bean类,进行注解解析 -->

        <!-- <context:component-scan base-package="org.lyl.annotation"></context:component-scan> -->

               

      </beans>

   通过配置 <context:annotation-config/>开启注解处理器

5)创建一个测试类

public class AnnotationTest {

    public static void main(String[] args) {

       String xmlPath="org/lyl/annotation/beans.xml";

       ApplicationContext context=new ClassPathXmlApplicationContext(xmlPath);

       UserController controller=(UserController) context.getBean("userController");

       controller.save();

    }

}

 

运行结果如图

结果显示spring注解调用成功

 

6)当文件中的注解很多时xml定义的实例会有很多

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

<bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean>

    <bean id="userService" class="org.lyl.annotation.UserServiceImpl"></bean>

    <bean id="userController" class="org.lyl.annotation.UserController"></bean>

… …

 

会显得xml配置文件很臃肿,这时可以开启注解注解扫描器,自动扫描包下的所有注解

<!-- 使用context命名空间通知spring扫描指定包下所有Bean类,进行注解解析 -->

         <context:component-scan base-package="org.lyl.annotation"/>

一行可以替上代面多行

7)注解在一定程度上减少代码量,一些公司在不使用注解时要减少代码量,可以使用自动装配,Spring的<bean/>标签中有一个autowire的属性,可以设置autowire属性值来自动装配bean,所谓的自动装配,就是将bean注入到其他bean子元素的<property/>中,autowire属性有5个值,

defaul:根据上级标签的<beans/>的属性值而定,

byName:根据属性名自动装配,容器将根据名称自动查找与属性完全一致的bean,并将其属性自动装配,

byType:根据属性类型type自动装配,如果一个Bean的数据类型兼容另一个Bean的数据类型,则自动装配,

constructor:根据构造器参数类型进行byType自动装配,

no:默认情况下不使用自动装配,bean依赖必须通过ref元素定义;

 

demo步骤

删除dao实现类,service实现类,controler类的中的注解,使用setter()方自动装配bean实例

a.在UserServiceImpl类中创建setUserService方法

public void setUserService(UserService userService) {

       this.userService = userService;

    }

b.在controller类中创建setUserService方法

public void setUserService(UserService userService) {

       this.userService = userService;

    }

c.修改配置文件,设置<bean/>标签的autowire属性值

<?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-4.3.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context-4.3.xsd ">

        <!-- 将指定类配置给spring,spring创建其对象的实例 -->

        <!-- 使用context命名空间在配置文件中开启相应的注解处理器 -->

        <!-- 分别定义3个实例 -->

            <!-- 使用bean元素的autowired属性完成自动装配 -->

        <bean id="userDao" class="org.lyl.annotation.UserDaoImpl"></bean>

        <bean id="userService" class="org.lyl.annotation.UserServiceImpl" autowire="byName"></bean>

        <bean id="userController" class="org.lyl.annotation.UserController" autowire="byName"></bean>     

      </beans>

运行测试结果和5)中的测试结果一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值