文档章节

spring的注解注入

lzw_me
 lzw_me
发布于 2014/05/27 16:07
字数 1069
阅读 76
收藏 1

以前在使用spring是通过xml来注入的,每次增加一个service 或 dao都要修改xml 文件,现在也赶时髦用注解来实现。

 手工装配依赖对象,在这种方式中又有两种编程方式

  1. 在xml配置文件中,通过在bean节点下配置,如

   <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> <constructor-arg index=“0” type=“java.lang.String” value=“***”/>//构造器注入 <property name=“name” value=“zhao/>//属性setter方法注入 </bean>

第一种方式是在XML里注入的,这有什么不好地方呢?如果我们是在xml文件里进行注入的话,如果bean多的话,那么xml配置文件会很臃肿。 所以Spring在2.0和2.5的时候都给我们提供了一个减肥的方案,就是采用注解的方式来减轻配置文件臃肿的程度。

 

2. 在java代码中使用@Autowired或@Resource注解方式进行装配。

第一步:在applicationContext.xml进行相应的配置

以下命名空间的配置隐 式注册了多个对注释进行解析处理的处理 器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor.

  每个处理器都对应一些注解,好比AutowiredAnnotationBeanPostProcessor这个处理器专门用来解 析@Autowired这个注解的。CommonAnnotationBeanPostProcessor这个处理器专门用来解析@Resource这个 注解的;PersistenceAnnotationBeanPostProcessor这个处理器用来处理持久化方面的注解;。。。。。每个处理器都处 理相应的注解

  大家一定要注意一点:注解的本身和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:jee="
http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="
http://www.springframework.org/schema/context"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    default-lazy-init="true">
    <description>Spring公共配置文件</description>

    <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
    <context:component-scan base-package="com.jweb" />

    <!-- 数据源配置,在开发测试环境直连数据库 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mshop" />
        <property name="username" value="root" />
        <property name="password" value="mysql" />
    </bean>


    <!-- Hibernate配置 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            </props>
        </property>
        <property name="packagesToScan" value="com.jweb.entity.*" />
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>

    <!-- 事务管理器配置,单数据源事务 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
   
    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

</beans>

这一步关键是就是红色标识的地方。

第二步:在service及dao上使用注解说明这个组件是service还是dao

package com.jweb.service.user;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jweb.dao.user.UserDao;
import com.jweb.entity.user.User;

@Service
@Transactional
public class UserService {

   @Autowired
    private UserDao mdao;

   
    public UserDao getMdao() {
        return mdao;
    }


    public void setMdao(UserDao mdao) {
        this.mdao = mdao;
    }


    public List<User> findAll(){
        return mdao.findAll();
    }
   
}

package com.jweb.dao.user;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.jweb.entity.user.User;

@Repository
public class UserDao {
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

//在这里也可以直接注入配置的hibernateTemplate

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
   
    @SuppressWarnings("unchecked")
    public List<User> findAll(){
        return sessionFactory.getCurrentSession().createQuery("from User").list();
    }
}

用@service和@Repository只是明确的标识这个是什么类型的类,当然也可以用@Component来标识这个是一个可以注入的组件类。
这样就不在需要在xml文件中配置大量的bean了,是比较方便。

在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@Resource //Resource这个注解包的前缀是javax,这是J2EE提供的一个注解,这个注解不属于Spring的 //以后在使用注解方式注入对象的时候建议大家使用这个注解,而不要使用@Autowired注解 //@Autowired是Spring提供的; @Resource是J2EE提供的,在JDK1.6里就存在了 //这两个注解作用都一样,@Resource不属于Spring的,所以她没有跟框架紧密耦合,所以推荐大家使用这个


本文转载自:http://lvqionghua.blog.163.com/blog/static/185277420116113816675/

lzw_me
粉丝 4
博文 149
码字总数 42741
作品 0
昌平
程序员
私信 提问
spring学习笔记-依赖注入

学习过程访问的地址,按顺序理解: Spring@Autowired注解与自动装配 spring四种依赖注入方式 Spring注解注入 context:component-scan使用说明 详细:Spring零配置通过注解实现Bean依赖注入总...

KeepMoving
2015/03/03
116
0
Spring学习笔记1——基础知识

1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书《Expert one-on-one J2EE Design and Development》和《Expert one-on-one J2EE deve...

李长春
2011/10/09
514
0
详解Java的Spring框架中的注解的用法

使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: 配置文件: 1.2. 引入@Autowired注解(不推荐使用,建议使用@Resource) 类的实现(对成员变量进行标注) 或者...

Airship
2018/04/22
69
1
Spring面试题(70道,史上最全)

1.什么是spring? 2.使用Spring框架的好处是什么? 3.Spring由哪些模块组成? 4.核心容器(应用上下文)模块。 5.BeanFactory–BeanFactory实现举例。 6.XMLBeanFactory 7.解释AOP模块 8.解释J...

java技术栈
2017/11/08
0
0
【Spring】Autowiredd原理及与Resource注解区别

Autowired注解 Autowired顾名思义,表示自动注入,如下是Autowired注解的源代码: 从Autowired的实现可以看到,Autowired可以用于类的构造方法,类的字段,类的方法以及注解类型上,但是Aut...

weknow
2018/03/06
626
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部