文档章节

Spring注入方式介绍

开源俱乐部
 开源俱乐部
发布于 2014/06/22 22:31
字数 1531
阅读 9539
收藏 6

一、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的属性变量名都以小写字母起头,但也存在特殊情况;

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

        

© 著作权归作者所有

共有 人打赏支持
上一篇: Spring MVC开篇
下一篇: Spring配置
开源俱乐部
粉丝 10
博文 39
码字总数 31422
作品 0
朝阳
架构师
私信 提问
Spring实战 (一) 一切从Bean开始

Spring可以做很多事情,但是归根究底.Spring的核心仅仅是依赖注入(DI)/控制反转(IoC)和面向切面编程(AOP)而已.Spring的一切都是基于这2点 Spring的一切都是从Bean开始的.什么是Bean?凡是被Spr...

kenshiro
2013/09/05
0
0
Spring DI 注入方式介绍

Spring DI 注入方式介绍 Spring DI注入方式介绍,注入的配置可以用xml配置文件,或者annotation。 一、 属性注入 public class UserServiceImpl implements UserService{ @Autowired privat...

java程序员
2012/03/16
0
0
Spring框架笔记(三)——Spring容器、属性注入和构造器注入详解

Spring 容器 在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用. Spring 提供了两种类型的 IOC 容器...

HappyBKs
2015/07/12
0
5
spring 四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类...

举个_栗子
2017/12/17
0
2
spring学习4-bean配置文件

上篇简单介绍了一下bean配置文件注入简单的属性和复杂一点的类注入,今天说一下其他类型的注入。 spring中提供配置Bean有三种实例化的方式 类构造器实例化 静态工厂方法实例化 实例工厂方法实...

大嘴吃鸡腿
2014/03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
2
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
4
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0
Kernel I2C子系统

备注:所有图片来源于网络 1,I2C协议: 物理拓扑: I2C总线由两根信号线组成,一条是时钟信号线SCL,一条是数据信号线SDA。一条I2C总线可以接多个设备,每个设备都接入I2C总线的SCL和SDA。I...

yepanl
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部