a.通过类的无参构造方法创建对象

在入门案例中就是这种方式。当用最普通的方式配饰一个<bean>时,默认就是采用类的

无参构造创建对象。在Spring容器初始化时,通过<bean>上配置的class属性反射的到字

节码对象,通过newInstance()创建对象。

    Class c = Class .forName("类的全路径名称")
Object obj = c.newInstance()

这种方式下Spring创建对象,必须有无参的构造,否则无法通过反射创建对象,会抛出异常。

package cn.tedu.beans;

public class Person {
public Person(String str) { System.out.println("有参构造 ~~~");
} public void say() {
System.out.println("person hello spring ~~~");
}
}
    @Test
/**
* SpringIOC 创建对象方式 1 - 通过无参构造方法创建对象
*/ public void test4(){
/*
<bean id="person" class="cn.tedu.beans.Person"></bean>
<alias name="person" alias="per"/>
*/ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过id获取
Person p = (Person) context.getBean("person");
p.say(); }

b.通过静态工厂创建对象

很多时候,我们面对的类是无法通过无参构造去创建的,例如该类没有无参构造、是一抽象类等等情况,此时无法要求spring通过无参构造创建对象,此时可以使用静态工厂方式创建对象。

package cn.tedu.factory;

import java.util.Calendar;

public class CalendarStaticFactory {
public static Calendar getInstance(){
return Calendar.getInstance();
}
}
<?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
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
> <bean id="calendar" class="cn.tedu.factory.CalendarStaticFactory" factory-method="getCalendar"></bean> </beans>
    @Test
/**
* SpringIOC 创建对象方式 2 - 静态工厂
*/
public void test5(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过id获取
Calendar calendar = (Calendar) context.getBean("calendar");
System.out.println(calendar);
}

c.实例工厂创建对象

实例工厂也可以解决类是无法通过无参构造创建的问题,解决的思路和静态工厂类似,只不过实例工厂提供的方法不是静态的。Spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。

package cn.tedu.factory;

import java.util.Calendar;

public class CalendarFactory {
public Calendar getCalendar(){
return Calendar.getInstance();
}
}
<?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
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
> <bean id="calendarFactory" class="cn.tedu.factory.CalendarFactory"></bean>
<bean id="calendar" factory-bean="calendarFactory" factory-method="getCalendar"></bean> </beans>
    @Test
/**
* Spring 创建对象方式3 - 实例工厂
*/
public void test7(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Calendar calendar = (Calendar) context.getBean("calendar");
System.out.println(calendar);
}

d.Spring工厂创建对象

Spring内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。

package cn.tedu.factory;

import java.util.Calendar;

import org.springframework.beans.factory.FactoryBean;

public class CalendarSpringFactory implements FactoryBean<Calendar> {

    /**
* Spring工厂生产对象的方法
*/
@Override
public Calendar getObject() throws Exception {
return Calendar.getInstance();
} /**
* 获取当前工厂生产的对象的类型的方法
*/
@Override
public Class<?> getObjectType() {
return Calendar.class;
} /**
* Spring工厂生产对象时是否采用单例模式
* 如果返回true,则在spring中该对象只创建一次,后续重复使用
* 如果返回false,则每次获取该bean都重新创建对象
*/
@Override
public boolean isSingleton() {
return true;
}
}
<?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
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
> <bean id="calendar" class="cn.tedu.factory.CalendarSpringFactory"></bean> </beans>
    @Test
/**
* SpringIOC 创建对象方式 3 - spring工厂
*/
public void test6(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过id获取
Calendar calendar = (Calendar) context.getBean("calendar");
System.out.println(calendar);
}

Spring IOC - 控制反转(依赖注入) - 创建对象的方式的更多相关文章

  1. Spring IOC - 控制反转(依赖注入) - 入门案例 - 获取对象的方式 - 别名标签

    1. IOC - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交 由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和生命周 ...

  2. Spring IOC - 控制反转(依赖注入) - 单例和多例

    Spring容器管理的bean在默认情况下是单例的,即一个bean只会创建一个对象,存在map中,之后无论获取多少次该bean,都返回同一个对象. Spring默认采用单例方式,减少了对象的创建,从而 ...

  3. Spring IOC - 控制反转(依赖注入) - 配置初始化和销毁的方法

    在Spring中如果某个bean在初始化之后,或销毁之前要做一些额外操作可以为该bean配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...

  4. Spring IOC - 控制反转(依赖注入) - 懒加载机制

    懒加载机制 Spring默认会在容器初始化的过程中,解析xml,并将单例的bean创建并保存到map中,这样的机制在bean比较少的时间问题不大,但一旦bean非常多时,Spring需要在启动的过程中 ...

  5. 学习Spring IOC控制反转和DI依赖注入总结

    30岁的小曹,20岁的身体,还在坚持在能力允许控制范围内22点睡觉,5点起床锻炼身体,好好学习,除了加班或者像今天这样的深夜,再一次写已经有X百万人写过的 spring Ioc 的总结博客. 一.IO ...

  6. Spring 01: Spring配置 + IOC控制反转 + Setter注入

    简介 Spring框架是一个容器,是整合其他框架的框架 他的核心是IOC(控制反转)和AOP(面向切面编程),由20多个模块构成,在很多领域都提供了优秀的问题解决方案 特点 轻量级:由20多个模块构成 ...

  7. Spring IOC(控制反转)思想笔记

    Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...

  8. Spring IoC控制反转创建实例

    Spring IoC控制反转创建实例写一个配置文件beans.xml,配置文件的约束可以访问:完整链接:https://repo.spring.io/libs-release-local/org/sp ...

  9. Spring框架使用(控制反转,依赖注入,面向切面AOP)

    参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...

随机推荐

  1. NETGEAR WNDR3800CH openwrt 不能用新版, Barrier Breaker 14.07

    15系列主要是不能正常端口映射,这个很不方便了. 尽管80端口被封了,我们可以用别的端口啊. 刷完以后,不懂英文的,跟着下面的步骤就可以进入中文环境了. 记得先上网,再通过路由下载安装中文包,才可以. ...

  2. 常用docker

    随便什么版本的linux 接入daocloud.io 在发现镜像中选择DockerHub 搜索对应的image,然后部署. 手动输入YAML即可 aria: image: cuteribs/aria2 ...

  3. 元素大小-偏移量(offset)客户区大小(client)滚动大小(scroll)

    一.偏移量---offset 1.定位父级 在理解偏移大小之前,首先要理解offsetParent.人们并没有把offsetParent翻译为偏移父级,而是翻译成定位父级,很大原因是offsetPar ...

  4. MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(六)

    [周年庆]MyEclipse个人授权 折扣低至冰点!立即开抢>> [MyEclipse最新版下载] MyEclipse支持Java EE技术(如JAX-WS和EJB 3.0),它们以功能包 ...

  5. wavepicking

    http://www.seismology.harvard.edu/research/wavePicking.html

  6. sed工具命令

    sed是非交互式的编辑器.它不会修改文件,除非使用shell来重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件,并将结果发送到屏幕.具体过程如下:首先sed把当前 ...

  7. SQL 基础--> NEW_VALUE 的使用

    --=============================== -- SQL 基础--> NEW_VALUE 的使用 --=============================== 通常 ...

  8. 【机器学习算法】cascade classifier级联分类器

    前言 参考 1.级联分类器: 完

  9. 使用struts框架后的404错误

    访问jsp界面后出现404错误,我开始以为是因为struts没有配置好,在网上找了很多解决方法, 试了一遍,无效, 最后在参考书上看到“struts2推荐把所有的视图界面存放在WEB-INF目录下,这 ...

  10. ubuntu18.04虚拟机突然不能上网问题解决办法

    周末在家啃书学docker,win10上装的虚拟机,ubuntu18.04,突然执行apt-get update报错,域名无法解析,怀疑是dns文件有问题,折腾了很久,各种百度,修改dns文件,仍然报 ...