文档章节

Spring注入方式介绍

开源俱乐部
 开源俱乐部
发布于 2014/06/22 22:31
字数 1531
阅读 9472
收藏 6
点赞 1
评论 0

一、Spring注入基础

        Spring为我们提供了丰富的注入方式,本文将逐一介绍。

(1)开篇准备

        开篇我们需要先准备一个接近真实项目的项目环境。项目的层次结构如下:

    1. com.uni2uni.spring.model:实体层。

    2. com.uni2uni.spring.dao:数据访问接口层。        

    3. com.uni2uni.spring.dao.impl:数据访问接口实现层。

    4. com.uni2uni.spring.service:业务逻辑接口层。

    5. com.uni2uni.spring.service.impl:业务逻辑接口实现层。

    6. com.uni2uni.spring.action:struts2的Action层。

    7. com.uni2uni.spring.test:测试层。

    最终项目的目录结构如下图所示:

    按照层次接口类的代码分别如下:

    User.java代码如下:

    package com.uni2uni.spring.model;
    public class User {
     public int getId() {
      return id;
     }
     public void setId(int id) {
      this.id = id;
     }
     public String getUsername() {
      return username;
     }
     public void setUsername(String username) {
      this.username = username;
     }
     private int id;
     private String username;
     @Override
     public String toString() {
      return "User [id=" + id + ", username=" + username + "]";
     }
     
     public User() {
     }
     public User(int id, String username) {
      super();
      this.id = id;
      this.username = username;
     }
     
    }

    IUserDao.java代码如下:

    package com.uni2uni.spring.dao;
    import com.uni2uni.spring.model.User;
    public interface IUserDao {
     public void add(User user);
     public void delete(int id);
     public User get(int id);
    }

    UserDao.java代码如下:

    package com.uni2uni.spring.dao.impl;
    import com.uni2uni.spring.dao.IUserDao;
    import com.uni2uni.spring.model.User;
    public class UserDao implements IUserDao{
     @Override
     public void add(User user) {
      System.out.println("添加了"+user);  
     }
     @Override
     public void delete(int id) {
      
      System.out.println("删除了"+id);
     }
     @Override
     public User get(int id) {
      System.out.println("获取了"+id);
      return null;
     }
     
    }

    IUserService.java代码如下:

    package com.uni2uni.spring.service;
    import com.uni2uni.spring.model.User;
    public interface IUserService {
     public void add(User user);
     public void delete(int id);
     public User Get(int id);
    }

        UserService.java代码如下:

package com.uni2uni.spring.service.impl;
import com.uni2uni.spring.dao.IUserDao;
import com.uni2uni.spring.model.User;
import com.uni2uni.spring.service.IUserService;
public class UserService  implements IUserService{
 private IUserDao userDao;
 public IUserDao getUserDao() {
  return userDao;
 }
 public void setUserDao(IUserDao userDao) {
  this.userDao = userDao;
 }
 @Override
 public void add(User user) {
  userDao.add(user);
 }
 @Override
 public void delete(int id) {
  userDao.delete(id);  
 }
 @Override
 public User Get(int id) {
  userDao.get(id);
  return null;
 }
}

        spring-conf.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
"
 xsi:schemaLocation="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
">
 <bean id="userDao" class="com.uni2uni.spring.dao.impl.UserDao" />
 <bean id="userService" class="com.uni2uni.spring.service.impl.UserService">
  <property name="userDao" ref="userDao"></property>
 </bean>
 <bean id="userAction" class="com.uni2uni.spring.action.UserAction">
  <property name="userService" ref="userService"></property>
 </bean>
</beans

        TestSpring.java中的内容如下所示:

package com.uni2uni.spring.test;
import junit.framework.TestCase;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.uni2uni.spring.action.UserAction;
import com.uni2uni.spring.model.User;
public class TestSpring extends TestCase{
 private BeanFactory factory=new ClassPathXmlApplicationContext("spring-conf.xml");
 
 public void test1(){
  UserAction ua= factory.getBean("userAction",UserAction.class);
  User u = new User(1,"张三");
  ua.setUser(u);
  ua.add();
 }
}

(2)Spring注入的基本步骤

        Spring注入的基本步骤如下:

    1. 将所有的类在spring-conf.xml中创建bean

      语法如下:

      <bean id="beanId" class="包名.类名">

    2. 对所有依赖的类进行注入

      1. 如果是属性注入,需要为每一个依赖类创建相应的getter和setter方法

      2. 如果是构造方法注入,需要为依赖类创建相应的构造方法            

    3.  在测试方法中测试是否正确注入

二、Spring注入方式介绍

(1)属性注入

        属性注入的语法如下:

        <bean id="被注入的类的beanId" class="包名.类名" />

        <bean id="beanId" class="包名.类名">
              <property name="被注入的bean的名字" ref="被注入的类的beanId"></property>
         </bean>

        在本例中,属性注入的具体配置如下:

<bean id="userDao" class="com.uni2uni.spring.dao.impl.UserDao" />
 <bean id="userService" class="com.uni2uni.spring.service.impl.UserService">
  <property name="userDao" ref="userDao"></property>
 </bean>

        因为UserService依赖与UserDao,因此需要在userService中创建相应的getter和setter方法。UserService中的属性定义如下所示:

package com.uni2uni.spring.service.impl;
import com.uni2uni.spring.dao.IUserDao;
import com.uni2uni.spring.model.User;
import com.uni2uni.spring.service.IUserService;
 
public class UserService  implements IUserService{
 
 private IUserDao userDao;
 public IUserDao getUserDao() {
  return userDao;
 }
 public void setUserDao(IUserDao userDao) {
  this.userDao = userDao;
 }
  ......省略部分代码 
}

(2)构造方法注入

        构造方法注入的语法如下:

        <bean id="被注入的类的beanId" class="包名.类名" />

        <bean id="beanId" class="包名.类名">
              <constructor-arg ref="被注入的类的beanId" />         

        </bean>

        本例中,构造方法注入的具体配置如下:

<bean id="userService" class="com.uni2uni.spring.service.impl.UserService" />
 <bean id="userAction" class="com.uni2uni.spring.action.UserAction">
  <constructor-arg ref="userService" />
 </bean>

        由于本例中使用构造方法注入,因此需要在UserAction中编写UserService的构造方法,UserAction中的构造方法定义如下所示:

package com.uni2uni.spring.action;
import com.uni2uni.spring.model.User;
import com.uni2uni.spring.service.IUserService;
 
public class UserAction {
 private IUserService userService;

 public UserAction(IUserService userService) {
  super();
  this.userService = userService;
 }
    ......省略部分代码 
}

(3)自动注入

        自动注入语法如下所示:

        <bean id="beanId" class="包名.类名" autowire="参数值" />

        autowire的参数值可选有:“default”、“byName”、“byType”、“constructor”、“no”。

        default:根据bean的自省机制决定采用byType还是constructor进行自动装配,如果Bean提供了默认的构造函数,则采用byType,否则采用constructor。

        byName:通过属性名自动注入。

        byType:通过属性类型自动注入。

        constructor:与byType相同,但作用于构造器。

        no:不自动注入。

(4)Annotation注入

        Spring在3.0以后,提供了基于Annotation(注解)的注入。

        这种方式是在类名上使用注解的方式进行注入。

        Annotation注入的步骤如下:

        a.配置spring.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:aop="
http://www.springframework.org/schema/aop"
     xmlns:context="
http://www.springframework.org/schema/context"
     xsi:schemaLocation="
http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
   <!--第一步.、打开Spring的Annotation支持 -->
   <context:annotation-config/>
   <!-- 第二步、设定Spring 去哪些包中找Annotation -->
   <context:component-scan base-package="com.uni2uni.spring"/>
   <!-- 第三步、打开基于Annotation的AOP -->
   <aop:aspectj-autoproxy/>
</beans>

        b.在类上面添加注解

具体方法是:在类上面加@Component("beanId"),在setter方法上加@Resource即可。如果需要指定scope属性,则添加@Scope("singleton|prototype|...")即可。如下所示:

package com.uni2uni.spring.action;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.uni2uni.spring.model.User;
import com.uni2uni.spring.service.IUserService;
@Component("userAction")
@Scope("prototype") 
public class UserAction {
 private User user;
 private IUserService userService;
 private int id;
 public UserAction(IUserService userService) {
  super();
  this.userService = userService;
 }
 public User getUser() {
  return user;
 }
 
 @Resource
 public void setUser(User user) {
  this.user = user;
 }
 public IUserService getUserService() {
  return userService;
 }
 @Resource
 public void setUserService(IUserService userService) {
  this.userService = userService;
 }
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public void add(){
  userService.add(user);
 }
 
 public void delete(){
  userService.delete(id);
 }
 
 public void Get(){
  userService.Get(id);
 }
}

        注意:在新的Spring3的标准中,已经不推荐使用@Component的方式来完成bean的创建。新的标准提供了更多的Annotation来替代@Component。例如:

        @Repository:一般用于Dao的注入;

        @Service:一般用于Service层的注入;

        @Controller:一般用于Action层的注入。

三、知识扩展

(1)Spring注入方式最佳实践

        Spring注入最常用的是属性注入,构造方法注入、自动注入、Annotation方式的注入一般不用。

        Annotation注入平时多用于一些小项目。

(2)JavaBean关于属性命名的特殊规范

        一般情况下,Java的属性变量名都以小写字母起头,但也存在特殊情况;

        变量的前两个字母要么全部大写,要么全部小写。

        

© 著作权归作者所有

共有 人打赏支持
开源俱乐部
粉丝 10
博文 39
码字总数 31422
作品 0
朝阳
架构师
类似 Spring 的开源框架 - JCute

JCute 是什么 jcue是一套功能类似Spring的开源框架,基于JDK1.6开发,实现了Spring的大部分功能,但用法相对Spring要简洁,整体采用注解方式,代码清晰,功能灵活,用户也可扩展基于xml文件或...

看-野生程序猿 ⋅ 04/15 ⋅ 0

详解Java的Spring框架中的注解的用法

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

Airship ⋅ 04/22 ⋅ 0

springboot整合kaptcha验证码

前言: 关于kaptcha简介以及spring整合kaptcha,我在另一篇文章中已详细讲解,请参考:spring整合kaptcha验证码。 本文将介绍springboot整合kaptcha的两种方式。 开发工具及技术: 1、idea 2017...

贪挽懒月 ⋅ 05/10 ⋅ 0

Spring AOP中自我调用的问题

前几天在做项目的时候同事说,在使用AOP进行拦截的时候发现有些方法有时候能输出拦截的日志有时候不输出拦截的日志。发现在单独调用这些方法的时候是有日志输出,在被同一个类中的方法调用的...

木叶之荣 ⋅ 2017/05/21 ⋅ 0

Spring IOC知识点一网打尽!

前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工...

Java3y ⋅ 05/22 ⋅ 0

说说 Spring 的注解配置

1 定义 Bean XML 或注解配置方式,都是表达 Bean 定义的载体,其实质都是为 Spring 容器提供 Bean 定义的信息 。 基于注解的配置方式,从 Spring2.0 开始引入, Spring2.5 完善, Spring4.0 ...

deniro ⋅ 05/10 ⋅ 0

Spring MVC 到 Spring BOOT的简化之路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦。因为...

临江仙卜算子 ⋅ 05/09 ⋅ 0

IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981 ⋅ 2016/07/25 ⋅ 14

Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点。并且会与一些低版本的Spring有冲突,要看官方文档...

easonjim ⋅ 2017/10/05 ⋅ 0

【SpringBoot】RESTful API拦截-过滤器、拦截器、切片

前言 这里了解一下restful api的拦截,文本主要介绍三种方式来对api进行拦截,参考本文可实现拦截api,进行一些附加操作,比如打印拦截到的方法所在类名,获取原始的request,拦截到api的调用...

zlt995768025 ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 46分钟前 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部