博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring中bean的自动装配和作用域
阅读量:4289 次
发布时间:2019-05-27

本文共 2588 字,大约阅读时间需要 8 分钟。

在上一节《》我们讲了spring注入的几种方式:构造器注入、set注入、p命名空间注入和c命名空间注入,今天我们来说一下自动装配---autowire。

自动转配是可以简化spring的配置文件。

1、byName装配

新建一个java项目,结构如图:

接口类UserDao代码:

package com.my.spring.dao;public interface UserDao {	public void getUser() ;	}

接口实现类UserDaoMySqlImpl代码:

package com.my.spring.dao.impl;import com.my.spring.dao.UserDao;public class UserDaoMySqlImpl implements UserDao{	@Override	public void getUser() {		System.out.println("MySql获取用户数据");	}}

UserDaoOracleImpl代码:

package com.my.spring.dao.impl;import com.my.spring.dao.UserDao;public class UserDaoOracleImpl implements UserDao{	@Override	public void getUser() {		System.out.println("Oracle获取用户数据");	}}

UserService接口类代码:

package com.my.spring.service;public interface UserService {	public void getUser() ;	}

实现类UserServiceImpl代码:

package com.my.spring.service.impl;import com.my.spring.dao.UserDao;import com.my.spring.service.UserService;public class UserServiceImpl implements UserService{	private UserDao userDao = null ;		public void setUserDao(UserDao userDao) {		this.userDao = userDao;	}		@Override	public void getUser() {		userDao.getUser() ;	}}
beans.xml配置代码:

其中Service的bean使用的是自动装配byName,对应的类UserServiceImpl中的关系如图:

右边service对应的bean中的类中属性有一个setUserDao()方法,这个setUserDao()方法去掉set后,剩下是的userDao,然后到右边的beans.xml配置中寻找id是userDao的bean,如果找了,就对应装配成这个bean的class,如果找不到,就不装配。

测试类Test代码:

package com.my.spring.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.my.spring.service.UserService;public class Test {	public static void main(String[] args) {		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml") ;		UserService us = (UserService) ac.getBean("service") ;		us.getUser() ;	}	}

运行结果在控制台打印如图:

为了解决在beans.xml中的每一个bean后面都配置autowire,所以还有一种简便写法,就是在头文件处写default-autowire="byName"  如图:

2、byType装配

byType(不建议使用):根据类型进行自动装配,不用管bean的id . 但是同一种类型的bean只能有一个;

beans.xml配置文件:

在上面这个配置文件中,有两个UserDao的实现类,如果是这种情况,运行测试类Test,就会报错,因为有两个UserDao的实现类,容器不知道找那个,所以这种很容易出现错误,建议慎用!!!

如果想运行正常,只能存在一个UserDao的实现类。

3、constructor装配

其他代码不变,UserServiceImpl代码中去掉了set方法,增加了构造方法,代码如:

package com.my.spring.service.impl;import com.my.spring.dao.UserDao;import com.my.spring.service.UserService;public class UserServiceImpl implements UserService {	private UserDao userDao = null;	public UserServiceImpl(UserDao userDao) {		this.userDao = userDao;	}	public void getUser() {		userDao.getUser();	}}

beans.xml代码:

二、作用域

注意:在整合struts2和spring时,需要将Action设为scope=“prototype”

你可能感兴趣的文章
解决Ubuntu16.04更新源时显示“暂时不能解析域名”问题
查看>>
Ubuntu16.04运行清空文件命令时提示权限不够解决方法
查看>>
shell脚本编写笔记
查看>>
Ubuntu16.04实现定时免密远程拷贝脚本
查看>>
Ubuntu 16.04安装Docker
查看>>
Docker报错:Temporary failure in name resolution&Proxy Authentication Required
查看>>
mySQL常用操作及基础知识
查看>>
Ubuntu16.04安装python3.6
查看>>
linux安装Anaconda
查看>>
Ubunu16.04安装CPU版本Tensorflow
查看>>
conda常用命令和基础知识整理
查看>>
ImportError: libgfortran.so.4: cannot open shared object file: No such file or directory
查看>>
Django搭建网站笔记
查看>>
不抱怨的世界
查看>>
运动减肥篇
查看>>
自己测到的Buu IP
查看>>
yum配置与使用(很详细)
查看>>
yum的使用
查看>>
./configure 的配置和用法
查看>>
web.config
查看>>