java spring 注入方式,Spring注入方式介绍

一、Spring注入基础

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

(1)开篇准备

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

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

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

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

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

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

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

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

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

1001828efd1ac1cac3f996430d57079f.png

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

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代码如下:

xmlns:xsi="

http://www.w3.org/2001/XMLSchema-instance

"

xsi:schemaLocation="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

">

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注入的基本步骤如下:

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

语法如下:

对所有依赖的类进行注入

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

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

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

二、Spring注入方式介绍

(1)属性注入

属性注入的语法如下:

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

因为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)构造方法注入

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

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

由于本例中使用构造方法注入,因此需要在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)自动注入

自动注入语法如下所示:

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值