Spring的对象创建


Spring学习笔记 周芋杉2021/5/15


原理:工厂设计模式,通过反射创建对象。

 Spring工厂分类
非web环境:ClassPathXmlApplicationContext
web环境:XmlWebApplicationContext

简单原理

//String Key是从Properties文件读取的键值对,类似Spring的<bean>
public Object getBean (String Key){
Object ret=null;
try {
//通过反射获取对象
Class clazz=Class.forName(env.getProperty(Key));
//底层调用了new
ret =clazz.newInstance();
}catch (Exception e){
e.printStackTrace();
}
return ret;

1.简单对象的创建

简单对象指的是直接通过new就可以得到的对象

步骤:

	1.读取配置文件和写入配置文件
2.获取Key-value
3.获取对象内容,一般是为对象内容提供set/get方法

​ 读取配置文件

ApplicationContext context=new ClassPathXmlApplicationContext("/ApplicationContext.xml");
Object object= (Object) context.getBean("object");

写入配置文件

<bean id="object" class="#object的实现类的全限名命"></bean>

获取内容

//直接调用object的get方法
Object object.getxxx();

2.复杂对象的创建

不能通过直接new的对象比如Connection SessionFactory 等

实现复杂对象的方式:

1.FactoryBean

开发步骤

	1.实现FactoryBean接口
重写三个方法
2.在配置文件中配置
3.创建和使用

实现FactoryBean接口(例如实现Connection )

//给FactoryBean指定泛型为Connection
public class FactoryBean implements org.springframework.beans.factory.FactoryBean<java.sql.Connection> {
//提供对应的set/get方法方便注入
private String Driver;
private String Url;
private String user;
private String password;
//创建连接复杂对象
@Override
public java.sql.Connection getObject() throws Exception {
Class.forName(Driver);
java.sql.Connection conn = DriverManager.getConnection(Url,user,password);
return conn;
}
//返回值类型是Connection
@Override
public Class<?> getObjectType() {
return Connection.class;
}
//指定是否多次创建
@Override
public boolean isSingleton() {
return false;
}
public String getDriver() {
return Driver;
} public void setDriver(String driver) {
Driver = driver;
} public String getUrl() {
return Url;
} public void setUrl(String url) {
Url = url;
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }

配置文件中注入,和之前一样

 <bean id="conn" class="org.FactoryBean.FactoryBean">
<property name="Driver" value="com.mysql.jdbc.Driver"/>
<property name="password" value="123456"/>
<property name="Url"
value="jdbc:mysql://localhost:3306/jdbc_test"/>
<property name="user" value="root"/>
</bean>

创建和使用

注意:在获取conn时必须加&

 public  void connectionFactoryBean(){
ApplicationContext context =new ClassPathXmlApplicationContext("/ApplicationContext.xml");
FactoryBean conn= (FactoryBean)context.getBean("&conn");
System.out.println("Conn= "+conn);
}

2.实例工厂创建

	目的:
使得老系统整合进Spring
使得Spring没有侵入性
	开发步骤:
1.老系统代码
2.在配置文件中配置

例如:

老系统代码,简单的创建连接代码

public class OldFactory {
public Connection getconn() throws ClassNotFoundException, SQLException {
Connection connection=null;
Class.forName("com.mysql.cj.jdbc.Driver");
connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test,"root","atgxstuSf2<e");
return connection;
}
}

在配置文件中

俩步骤

​ 1.配置老代码的工厂

​ 2.在整合配置中使用老代码工厂的id和指定方法

<bean id="oldconn" class="org.FactoryBean.OldFactory"/>
<bean id="Newconn" factory-bean="oldconn" factory-method="getconn"/>

3静态工厂

<bean id="XXX" Class="老代码的类" factory-method="老代码方法"/>

2Spring对象创建小结的更多相关文章

  1. Java中对象创建过程

    本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...

  2. Progress.js – 为页面上的任意对象创建进度条效果

    Progress.js 是一个 JavaScript 和 CSS3 的库,它帮助开发人员为网页上的每个对象创建和管理进度条效果.你可以设计自己的模板,进度条或者干脆定制. 您可以使用 Progress ...

  3. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

  4. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  5. javascript一种新的对象创建方式-Object.create()

    1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...

  6. 【JavaScript回顾】对象创建的几种模式

    组合使用构造函数模式和原型模式 创建自定义类型的常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实 例属性,而原型模式用于定义方法和共享的属性.结果,每个实例都会有自己的一份实例属性 ...

  7. Cocos2d-js中使用纹理对象创建Sprite对象

    本节我们会通过一个实例介绍纹理对象创建Sprite对象使用,这个实例如图5-2所示,其中地面上的草是放在背景(如下图所示)中的,场景中的两棵树是从后图所示的“树”纹理图片中截取出来的,图5-5所示是树 ...

  8. 实例:使用纹理对象创建Sprite对象

    精灵类是Sprite,它的类图如下图所示: Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的派生类有:PhysicsSprite和Skin.Physics ...

  9. Objective-C设计模式——工厂方法模式virtual constructor(对象创建)

    工厂方法模式 工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象. 工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的 ...

随机推荐

  1. DNS 缓存中毒--Kaminsky 攻击复现

    0x00 搭建实验环境 使用3台Ubuntu 16.04虚拟机,可到下面的参考链接下载 攻击的服务是BIND9,由于条件限制,这里使用本地的一台虚拟机当作远程DNS解析器,关闭了DNSSEC服务,其中 ...

  2. Shell 正则表达式详解

    Shell 正则表达式 什么是正则表达式? 正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串. 为什么要学正则表达式? 在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量 ...

  3. 201871030110-何飞 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    201871030110-何飞 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 ...

  4. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(四):客户端强类型约束,自动生成 API TS 类型定义

    系列 云原生 API 网关,gRPC-Gateway V2 初探 Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇 Go + gRPC-Gateway(V2) ...

  5. Java执行groovy脚本的两种方式

    记录Java执行groovy脚本的两种方式,简单粗暴: 一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容:一种是执行groovy脚本: 二者都通过Invocab ...

  6. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之准备安装-09

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之准备安装-09 欢迎加QQ群:1026880196 进行交流学习 准备安装 #controller1 ...

  7. JDK8接口新关键字default和static

    JDK8及以后,允许我们在接口中定义static方法和default方法. public interface InterfaceDemo { // static修饰符定义静态方法 static voi ...

  8. Python 语言特性:编译+解释、动态类型语言、动态语言

    1. 解释性语言和编译性语言 1.1 定义 1.2 Python 属于编译型还是解释型? 1.3 收获 2. 动态类型语言 2.1 定义 2.2 比较 2. 动态语言(动态编程语言) 3.1 定义 3 ...

  9. 1086 Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...

  10. hdu4862 费用流(不错)

    题意:       给你一个矩阵,你最多可以选择k条路线,k条路线的起点随意,每次行走的距离随意,但是只能往右或者下走,走过的点不能再走,而且每一步如果a->b,如果a和b的权值s相等那么就可以 ...