博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring之bean一基础
阅读量:6320 次
发布时间:2019-06-22

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

在前面得博客依赖注入与控制反转中演示了应用spring实现ioc,在ApplicationContext.xml中有bean的配置,里面只是bean简单的应用。这篇主要是进一步学习使用bean。

一、定义

View Code

上面的代码是之前博客配置的,可以看到bean的基本构成。<beans/>是Sring配置文件的根节点,一个<beans/>节点里面可以有多个<bean>节点。在bean中常用两个属性:ID,Class. ID是一唯一标识,来确定是哪个bean,可以让其他bean中使用id引用。class用来指定是哪个class。同时还可以设置scope属性,scope有两种:singleton,non-singelton。singleton:单实例模式(默认,构造方法为private),整个Spring的容器中只有一个共享实例存在(singleton)。non-singelton:每次请求该bean,Spring容器都会新建立一个bean实例,然后返回给程序(request,session,prototype)。

二、创建

Bean的命名机制

id 当在Spring的窗口当中,查找某个Bean对象时,首先根据id进行查找,将其余作为Bean的默认名称,如果ID属性不存在,则根据Name属性进行查找(将其中的第一个名称作为默认的名称),如果ID和NAME都不存在根据类的名称进行查找。id---------->name--------------->类名。

Bean的别名:可以使用alias来为bean指定别名.

下面的配置文件还是在上面的xml基础上修改的。这里配置了ID为ServiceImpl的bean设置了别名。我们可以使用它的name、id、alias来获取service。

View Code
package Cuiyw.SpringAop;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import Cuiyw.Spring.IService.IService;public class App {    public static void main( String[] args )    {        ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});        BeanFactory factory=context;        IService service=(IService)factory.getBean("ServiceA1");        service.service("Cuiyw ServiceA1");         service=(IService)factory.getBean("ServiceA");        service.service("Cuiyw ServiceA");         service=(IService)factory.getBean("ServiceImpl");        service.service("Cuiyw ServiceImpl");     }}
View Code

三、注入

1.基本类型和string

可以使用value元素来设置,在上面的代码基础上稍作修改

View Code
package Cuiyw.Spring.Service;import Cuiyw.Spring.IDao.IDao;import Cuiyw.Spring.IService.IService;public class ServiceImpl implements  IService{    private IDao dao;    private int baseProperty;    public IDao getDao() {        return dao;    }    public void setDao(IDao dao) {        this.dao = dao;    }    public void service(String name) {        System.out.println(dao.sayHello(name)+" baseProperty:"+getBaseProperty());    }    public int getBaseProperty() {        return baseProperty;    }    public void setBaseProperty(int baseProperty) {        this.baseProperty = baseProperty;    }}
View Code

对于string类型,XML解析器以String类型解析出数据,如果属性不是String类型,属性值会通过PropertyEditors转换为其他类型,比如时间类型.

2.注入bean

上面的代码中就注入了bean,在ServiceImpl中注入DaoImpl。可以使用ref来进行配置。

3.注入集合

常见的集合有list、map、set、property等,下面的代码是在ServiceImpl中定义了几个属性,然后在上下文中通过属性注入进去。为了测试,在DaoImpl中也增加了一个属性s。

package Cuiyw.Spring.Dao;import java.util.Calendar;import Cuiyw.Spring.IDao.IDao;public class DaoImpl implements IDao{    public String s;    public String getS() {        return s;    }    public void setS(String s) {        this.s = s;    }    public String sayHello(String name) {        int hour=Calendar.getInstance().get(Calendar.HOUR_OF_DAY);        if(hour<6) return "凌晨早,"+name;        if(hour<12)return "早上好,"+name;        if(hour<13)return "中午好,"+name;        if(hour<18)return "下午好,"+name;        return "晚上好,"+name+", s="+s;                }    }
View Code
package Cuiyw.Spring.Service;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;import Cuiyw.Spring.IDao.IDao;import Cuiyw.Spring.IService.IService;public class ServiceImpl implements  IService{    private IDao dao;    private int baseProperty;    private List lists;    private Set sets;    private Map
maps; private Properties pros; public IDao getDao() { return dao; } public void setDao(IDao dao) { this.dao = dao; } public void service(String name) { System.out.println(dao.sayHello(name)+",baseProperty:"+getBaseProperty()); for(int i=0;i
getLists() { return lists; } public void setLists(List
lists) { this.lists = lists; } public Set getSets() { return sets; } public void setSets(Set sets) { this.sets = sets; } public Map
getMaps() { return maps; } public void setMaps(Map
maps) { this.maps = maps; } public Properties getPros() { return pros; } public void setPros(Properties pros) { this.pros = pros; }}
View Code

主要是注入的配置,在list、map、set属性中都是配置了一个基础类型value=1,两个DaoImpl类型。

1
1
prokeyA
prokeyB
View Code

执行main方法可以看到属性都注入进去了。

4.自定义属性编辑器

对于有一些属性是没法注入的,此时就需要自定义,比如上面说的日期类型。

首先是要定义一个继承PropertyEditorSupport的类,重写setAsText方法。

package Cuiyw.Spring.Service;import java.beans.PropertyEditorSupport;import java.text.ParseException;import java.text.SimpleDateFormat;public class CustomerProperty extends PropertyEditorSupport {    private String format="yyyy-MM-dd";    public String getFormat() {        return format;    }    public void setFormat(String format) {        this.format = format;    }    @Override    public void setAsText(String text) throws IllegalArgumentException {        // TODO Auto-generated method stub        SimpleDateFormat sdf=new SimpleDateFormat(format);        //super.setAsText(text);        try {            //转换对象,能过setValue方法重新赋值            this.setValue(sdf.parse(text));        } catch (ParseException e) {            e.printStackTrace();        }    }}
View Code

然后在配置文件配置这个类

View Code

这里还是在ServiceImpl中增加了一个java.util.Date类型的date属性。并在配置文件注入值。

View Code

 四、注入方式

package Cuiyw.Spring.Service;import Cuiyw.Spring.IDao.IDao;public class IOCWay {    /*public IOCWay(IDao dao, String name) {                this.dao = dao;        this.name = name;        System.out.println("调用构造函数实例化参数");    }    */    private IDao dao;    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public IDao getDao() {        return dao;    }    public void setDao(IDao dao) {        this.dao = dao;    }        public void print()    {        System.out.println(dao.sayHello(name));    }        }
View Code

上面创建了一个IOCWay类,构造函数主要是为了用来测试构造函数注入。

1.属性注入

上面用的都是属性注入。

View Code

2.构造函数注入  这里可以用index来设置是参数的位置

cuiyw
View Code

3.静态工厂方式

这里先创建一个工厂类

package Cuiyw.Spring.Service;import Cuiyw.Spring.Dao.DaoImpl;public class IOCFactory {    public static final DaoImpl getStaticFactoryDaoImpl(){         return new DaoImpl("cuiyw");     }}
View Code

在配置bean时使用下面的配置,可以看到在配置属性doa时是指向了daofactory,在daofactory中配置了factory-method

View Code

4.实例工厂方式

在上面工厂类中增加一个实例化方法。

package Cuiyw.Spring.Service;import Cuiyw.Spring.Dao.DaoImpl;public class IOCFactory {    public static final DaoImpl getStaticFactoryDaoImpl(){         return new DaoImpl("cuiyw");     }        public  final DaoImpl getInstanceFactoryDaoImpl(){         return new DaoImpl("cuiyw");     }}
View Code

这里还是往IOCWay注入dao和name。前面的静态工厂方法是不需要实例化工厂类的,而实例化工厂方法是需要实例化工厂类的。所以在配置factorydao时需要设置factory-bean。

View Code

上面算是把常见的4种注入方式学习了下,其实还有其他几种,已经通过注解来注入等,这里只学习了xml的注入,而且一般只有属性和构造函数常用。

转载地址:http://axkaa.baihongyu.com/

你可能感兴趣的文章
接收rtp over tcp 负载数据代码
查看>>
MySQL常用命令大全(一)
查看>>
C#学习基本概念之自动实现的属性
查看>>
图片等文件信息上传阿里云
查看>>
RAID深入讲解--文件系统inode和格式介绍(2、3)
查看>>
Linux 运维实践案例-2015年12月20日-12月31日
查看>>
第二章 大网 三层交换机
查看>>
MongoDB Shell简单操作
查看>>
13Exchange Server 2010跨站点部署-证书配置
查看>>
datetime.timedelta计算2个时间的时间差
查看>>
bash的变量中存放的字符串的处理方式
查看>>
1、redis基本概念简介
查看>>
音频噪声抑制(1):经典滤波器篇
查看>>
【24】Python装饰器笔记
查看>>
packetix ***连不上问题解决方法
查看>>
JavaScript获取文本框光标的像素位置3
查看>>
Oracle笔记(二) SQLPlus命令
查看>>
hp unix 参数
查看>>
以太坊
查看>>
RHEL5/centos5上安装配置iscsi server
查看>>