详解Spring Bean的配置方式与实例化

网友投稿 325 2022-07-24


目录一、 Spring Bean 配置方式配置文件开发注解开发二、Spring Bean实例化环境准备构造方法实例化Bean静态工厂实例化Bean实例工厂实例化BeanFactoryBean

一、 Spring Bean 配置方式

由 Spring IoC 容器管理的对象称为 Bean,Bean 配置方式有两种:配置文件开发和注解开发

配置文件开发

Spring 配置文件支持两种格式:xml和prhttp://operties,此教程以xml配置文件讲解。

XML 配置文件的根元素是 ,该元素包含了多个子元素 。每一个 元素都定义了一个 Bean

XML 配置文件常用元素表

属性名称描述idBean 的唯一标识符,Spring IoC 容器对 Bean 的配置和管理都通过该属性完成。nameBean 的别名,可以通过 name 属性为同一个 Bean 同时指定多个名称,每个名称vCfli之间用逗号或分号隔开。class指定了Bean 的具体实现类,它必须是一个类的全限定名。scopeBean 的作用域,属性值可以为 singleton(单例)、prototype(原型)、request、session 和 global Session。默认值是 singleton。

注解开发

先插个眼在这,过几天会发一篇文章详细介绍

二、Spring Bean实例化

通过控制反转,对象的创建权就交给了IoC容器,但是容器是如何来创建对象的呢?

bean本质上就是对象,对象在new的时候会使用构造方法,创建bean其实也是使用构造方法完成的。

实例化bean的三种方式:构造方法,静态工厂和实例工厂

环境准备

1.准备一个UserDao接口和一个UserDaoImpl实现类

//UserDao接口

public interface UserDao {

public void say();

}

//UserDaoImpl实现类

public class UserDaoImpl implements UserDao {

@Override

public void say() {

System.out.println("Hello,I am BigHorn!");

}

}

2.编写spring配置文件

3.编写运行程序

public class App {

public static void main(String[] args) {

//获取IoC容器

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

//从容器中获取对象

UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);

userDao.say();

}

}

构造方法实例化Bean

第一种实例化bean的方法:构造方法实例化,这也是最常用的方法,因为类都会提供默认的构造方法。下面来测试下

1.在UserDaoImpl类中添加一个无参构造方法,并打印一句话,方便观察结果。

public class UserDaoImpl implements UserDao {

//添加一个无参构造方法

public UserDaoImpl() {

System.out.println("这是UserDaoImpl的无参构造方法");

}

@Override

public void say() {

System.out.println("Hello,I am BigHorn!");

}

}

可以在控制台看到输出结果,说明Spring IoC 容器创建对象时用的也是构造方法

2.将构造方法改成private测试

public class UserDaoImpl implements UserDao {

//将构造方法改成private

private UserDaoImpl() {

System.out.println("这是UserDaoImpl的无参构造方法");

}

@Override

public void say() {

System.out.println("Hello,I am BigHorn!");

}

}

发现还可以运行成功,这说明Spring底层用的是反射,访问到类中的私有构造方法。

3.将无参构造方法换成有参构造方法

public class UserDaoImpl implements UserDao {

//将无参构造方法换成有参构造方法

private UserDaoImpl(int i) {

System.out.println("这是UserDaoImpl的无参构造方法");

}

@Override

public void say() {

System.out.println("Hello,I am BigHorn!");

}

}

程序会报java.lang.NoSuchMethodException错,说明Spring底层使用的是类的无参构造方法。

4.画个图总结下:Spring 配置文件中 bean 标签的 id 和类的全限定名一一对应,所以 Spring IoC容器的 getBean 方法其实就是先根据 bean 的 id 获取该类的全限定名,然后再利用反射根据类的全限定名创建对象并返回。

静态工厂实例化Bean

第二种实例化Bean的方法:静态工厂实例化

了解即可,一般是用来兼容早期的一些老系统。

1.创建一个UserDaoFactory工厂类并提供一个静态方法

//UserDao接口

public interface UserDao {

public void say();

}

//UserDaoImpl实现类

public class UserDaoImpl implements UserDao {

public UserDaoImpl() {

System.out.println("这是UserDaoImpl的无参构造方法");

}

@Override

public void say() {

System.out.println("Hello,I am BigHorn!");

}

}

//UserDaoFactory工厂类

public class UserDaoFactory {

//静态工厂创建对象

public static UserDao getUserDao(){

System.out.println("这是静态工厂实例化Bean");

return new UserDaoImpl();

}

}

2.编写spring配置文件

3.编写运行程序

public class App {

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

//获取IoC容器

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

//从容器中获取对象

UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);

userDao.say();

}

}

看见运行结果,输出以下语句

实例工厂实例化Bean

第二种实例化Bean的方法:实例工厂实例化

了解即可,其实和静态工厂差不多。只不过静态工厂可以直接通过静态方法创建bean,实例工厂要先new一个实例工厂对象,然后再通过这个实例工厂对象创建bean

1.创建一个UserDaoFactory工厂类,和静态工厂不一样的是,实力工厂提供的是一个普通方法

//UserDaoFactory工厂类

public class UserDaoFactory {

//实例工厂创建对象

public UserDao getUserDao(){

System.out.println("这是实例工厂实例化Bean");

return new UserDaoImpl();

}

}

2.编写spring配置文件

3.运行程序和静态工厂一样,查看运行结果

FactoryBean

实例工厂的方法听麻烦的,其实spring框架为我们一种实例工厂的方式:FactoryBean,比较实用,用来整合其他框架

我们只需要实现FactoryBean接口即可简化开发,下面来介绍下它的具体使用方法

1.创建UserDaoFactoryBean类,实现FactoryBean接口中的三个方法:

boolean isSingleton():设置bean作用域,默认true表示单例,false表示非单例T getObject() throws Exception:返回的是bean实例对象Class> getObjectType():返回的是被创建类的Class对象

public class UserDaoFactoryBean implements FactoryBean {

//bean作用域:默认true表示单例

public boolean isSingleton() {

return true;

}

//代替实例工厂中创建对象的方法

public UserDao getObject() throws Exception {

System.out.println("这是FactoryBean实例化bean");

return new UserDaoImpl();

}

//返回所创建类的Class对象

public Class> getObjectType() {

return UserDao.class;

}

}

2.编写spring配置文件

3.编写运行程序

public class App {

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

//获取IoC容器

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

//从容器中获取对象

UserDaoImpl userDao1 = context.getBean("userDao", UserDaoImpl.class);

UserDaoImpl userDao2 = context.getBean("userDao", UserDaoImpl.class);

System.out.println(userDao1);

System.out.println(userDao2);

}

}

以上就是详解Spring Bean的配置方式与实例化的详细内容,更多关于Spring Bean配置方式 实例化的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java实现简单小画板
下一篇:Spring JPA 增加字段执行异常问题及解决
相关文章

 发表评论

暂时没有评论,来抢沙发吧~