Spring创建对象的几种方法
一、通过构造器
无参构造器
<?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.xsd"> <!--配置我们的Dog类 spring 框架在底层
通过反射的机制 执行了我们的构造方法-->
<bean id="dog" class="cn.pb.dao.impl.Dog"></bean> </beans>
直接这样配置一个bean的话,相当于是调用这个Dog类的无参构造器,如果无参构造器不在,Spring上下文创建对象的时候就会报错。
无参构造器加setter方法注入field的值
类:
package com.mc.base.learn.spring.bean;
public class Person {
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
}
}
bean配置:
<?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.xsd"> <bean class="com.mc.base.learn.spring.bean.Person" id="person">
<property name="name" value="LiuChunfu"></property>
<property name="id" value="125"></property>
</bean> </beans>
就bean标签下再用property标签来设置name和value
如果有field是引用型的,就不用value,用ref = "xxx",xxx就是某个bean的id或者name
利用有参数的构造方法:
类代码:
package com.mc.base.learn.spring.bean;
public class Person {
private String name;
private Integer id;
public Person(String name, Integer id) {
super();
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Person [name=" + name + ", id=" + id + "]";
}
}
bean配置:
<?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.xsd"> <bean class="com.mc.base.learn.spring.bean.Person" id="person">
<constructor-arg name="id" value="123"></constructor-arg>
<constructor-arg name="name" value="LiuChunfu"></constructor-arg>
</bean> </beans>
就是在bean标签下面,有个<constructor-arg>标签来确定这个bean的构造器的参数咯。
二、静态的工厂方法
package cn.pb.dao; import cn.pb.dao.impl.Dog; /**
* AnimalFactory静态工厂类
*/
public class AnimalFactory {
/**
* 可以看到程序没有走构造方法
*/
public AnimalFactory(){
System.out.println("静态工厂的无参构造====");
}
//静态工厂,不会走无参构造
public static Animal getDog(){
System.out.println("工厂中静态获取Dog实例的方法");
return new Dog();
}
}
然后配置bean:
<?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.xsd"> <!--02.通过静态工厂 来创建我们对象的实例
工厂的本身构造不会执行 因为我们的方法是静态的 !类只会被加载,不会被实例化!
getDog必须是静态的-->
<bean id="dog" class="cn.pb.util.AnimalFactory" factory-method="getDog"></bean> </beans>
三、动态工厂——就非static的getDog方法
package cn.pb.dao; import cn.pb.dao.impl.Dog; /**
* AnimalFactory动态工厂类
*/
public class AnimalFactory {
/**
* 程序会先创建工厂实例 再调用getDog()方法
*/
public AnimalFactory(){
System.out.println("动态工厂的无参构造====");
}
//动态工厂 会先走无参构造 创建实例
public Animal getDog(){
System.out.println("工厂中动态工厂获取Dog实例的方法");
return new Dog();
}
}
bean的配置:
<?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.xsd"> <!--03.动态工厂创建 对象的实例-->
<bean id="factory" class="cn.pb.util.AnimalFactory"></bean><!-- 调用哪个工厂里的哪个方法 来创建对象 对象的id是dog-->
<bean id="dog" factory-bean="factory" factory-method="getDog"/> </beans>
这个Dog的对象呢,需要一个实例的一个getDog方法嘛,所以要先有这个实例Factory的bean,然后再在这个factory-bean上填这个factory的bean。
参考文章:
例子分别在这两篇当中搞过来的hh
https://www.cnblogs.com/LiuChunfu/p/5574383.html——《Spring创建对象的方式3种方式》这个是真的三种方法,下面那个emm
https://www.cnblogs.com/lyb0103/p/7611826.html——《Spring笔记03(Spring创建对象的三种方式) 》工厂方法还有静态工厂的用的是这篇的例子
Spring创建对象的几种方法的更多相关文章
- java中需要关注的3大方面内容/Java中创建对象的几种方法:
1)垃圾回收 2)内存管理 3)性能优化 Java中创建对象的几种方法: 1)使用new关键字,创建相应的对象 2)通过Class下面的new Instance创建相应的对象 3)使用I/O流读取相应 ...
- 创建对象的两种方法: new 和 面向对象(对象字面量)及对象属性访问方法
创建对象的两种方法: new 和 面向对象(对象字面量)用 new 时:var o = new Object();o.name = "lin3615";alert(o.name); ...
- Javascript 创建对象的三种方法及比较【转载+整理】
https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...
- 使用Spring Security3的四种方法概述
使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...
- Spring笔记03(Spring创建对象的三种方式)
1.创建对象的三种方式和bean的生命周期的验证: Animal接口代码: package cn.pb.dao; /** * 动物接口 */ public interface Animal { //吃 ...
- Spring创建对象的三种方式以及创建时间
创建对象的三种方式: 1.采用默认的构造函数创建 2.采用静态工厂方法 1.写一个静态工厂方法类 public class HelloWorldFactory { public static Hell ...
- java中创建对象的五种方法
用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. newIn ...
- Java中创建对象的5种方法
将会列举5种方法去创建 Java 对象,以及他们如何与构造函数交互,并且会有介绍如何去使用这些方法的示例. 作为一个 Java 开发人员,我们每天都会创建大量的 Java 对象,但是我们通常会使用依赖 ...
- Spring实例化Bean三种方法:构造器、静态工厂、实例工厂
Spring中Bean相当于java中的类,可以通过xml文件对bean进行配置和管理. 一.Bean的实例化: 构造器实例化.静态工厂实例化.实例工厂方式实例化. 目录: 构造器实例化: xml配置 ...
随机推荐
- 联系E-R:学生选课系统
- 如何解压deb文件
有两种方法: Bash代码 1.dpkg -x xx.deb /tmp/oo 注意:/tmp/oo为自己解压文件路径,可以随意指定路径 2.ar -vx xx.deb 这会解压出3个文件debian- ...
- 几个重要的 ASM Disk Groups 参数
几个重要的Disk group 属性: 1. ACCESS_CONTROL.ENABLED该属性用来控制某个disk group 上ASM FILE Access Control. 该参数有2个值:t ...
- 51nod 1218 最长递增子序列 V2——LIS+思路(套路)
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 自己怎么连这种 喜闻乐见的大水题 都做不出来了…… 好像见过 ...
- 数据库关键字 (Oracle, SQL Server, DB2)
Oracle SQL Server DB2 ! @@IDENTITY DETERMINISTIC & ADD DISALLOW ( ALL DISCONNECT ) ...
- python json ajax django四星聚会
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- sum(sum(abs(y))) 中 sum(sum())什么意思?
>> y=[1 3;2 5] y = 1 3 2 5 >> sum(y) ans = 3 8 >> sum(s ...
- JavaScript高级程序设计学习笔记第五章--引用类型
一.object类型 1.创建object类型的两种方式: 第一种,使用构造函数 var person = new Object();或者是var person={};/与new Object()等价 ...
- VMware10中安装centos7没有可用的网络设备
1.问题描述 centos7安装到虚拟机无法上网 2.安装环境 win7 x64 WM 10.01 iso CentOS-7-x86_64-DVD-1503-01.iso {4.01G} ...
- CodeForces 484A Bits(水题)
A. Bits time limit per test 1 second memory limit per test 256 megabytes input standard input output ...