使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
Java提供了Class类,可以通过编程方式获取类别的字段和方法,包括构造方法
获取Class类实例的方法:
类名.class
实例名.getClass()
Class.forName(className)
public class RefTest {
@Test
public void testRef(){
//Class cls = RefTest.class;
//Class.forName("com.jboa.service.RefTest");
//new RefTest().getClass();
}
Class类中包含getConstructors()、getFields()、getMethods();
在test写一个测试的实体类:
package com.jboa.service;
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Spring中是如何根据类名配置创建Bean实例的呢?下面代码:
package com.jboa.service;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.junit.Test;
public class RefTest {
@Test
public void testRef() throws Exception {
//Class cls = RefTest.class;
//Class.forName("com.jboa.service.RefTest");
//new RefTest().getClass();
Object obj = getBean("com.jboa.service.User");
this.setProperty(obj, "username", "admin");
this.setProperty(obj, "password", "passw");
User user = (User) obj; //对应ClassPathXmlApplicationContext.getBean(id)
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}
public Object getBean(String className) throws Exception {
Class cls = null;
try {
cls = Class.forName(className);//对应Spring ->bean -->class
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new Exception("类错误!");
}
Constructor[] cons = null;//得到所有构造器
try {
cons = cls.getConstructors();
} catch (Exception e) {
e.printStackTrace();
throw new Exception("构造器错误!");
}
if (cons == null || cons.length < 1) {
throw new Exception("没有默认构造方法!");
}
//如果上面没错,就有构造方法
Constructor defCon = cons[0];//得到默认构造器,第0个是默认构造器,无参构造方法
Object obj = defCon.newInstance();//实例化,得到一个对象 //Spring - bean -id
return obj;
}
public void setProperty(Object bean, String propertyName, Object propertyValue) throws Exception {
Class cls = bean.getClass();
Method[] methods = cls.getMethods();//得到所有方法
//cls.getFields();//所有公开字段属性
//注入属性 用户名:admin setUsername();
// obj username admin
//String propertyName = "username";//对应 Spring配置文件- property ->name
//String propertyValue = "admin";//对应:Spring -- property -->ref/value
for (Method m : methods) {
if (m.getName().equalsIgnoreCase("set" + propertyName)) {
//找到方法就注入
m.invoke(bean, propertyValue);
break;
}
}
}
}
运行;
参考的bean:
<bean id="employeeAction" class="com.jboa.action.EmployeeAction" scope="prototype"> <property name="employeeService" ref="employeeService"></property> <property name="dictionaryService" ref="dictionaryService"></property> </bean>
使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法的更多相关文章
- spring中的aop的xml配置方式简单实例
aop,即面向切面编程,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征 ...
- Spring中三个重要概念 IOC AOP Bean
Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...
- Spring中多配置文件以及寻觅引用其他bean的方式
Spring多配置文件有什么好处? 按照目的.功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理.数据源等少改动的配置与配置bean单独分开. Spring读取配置文件的几种方式: ...
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- Spring 中如何自动创建代理(spring中的三种自动代理创建器)
Spring 提供了自动代理机制,可以让容器自动生成代理,从而把开发人员从繁琐的配置中解脱出来 . 具体是使用 BeanPostProcessor 来实现这项功能. 这三种自动代理创建器 为:Bean ...
- Spring中各种扩展原理及容器创建原理
一.BeanFactoryPostProcessor BeanFactory的后置处理器:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:所有的bean定义已经保 ...
- (4) Spring中定时任务Quartz集群配置学习
原 来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运 行,没有任何错误日志,于是从jar包.JDK版本. ...
- Spring中Druid链接池的配置
本文记录了使用Druid的方法, 包括Spring和Spring boot中使用Druid的配置方法. Spring中配置Druid连接池 以链接mysql为例 1 添加druid依赖 <dep ...
- Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任务
Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz. Spring中使用Quartz的3种方法(MethodInvokingJobDetailFactoryBean,i ...
随机推荐
- mysql之子查询作业
#数据准备drop table if exists class;create table class( class_no int(2) unsigned zerofill primary key ...
- [ZJOI 2013]丽洁体
Description 题库链接 给出四个字符串 \(T,A,B,C\) ,问你至少在 \(T\) 串中删去几个单词能使得 \(T\) 串变为 \(A?B?C\) 的形式,其中 \(?\) 表示任意多 ...
- [NOI 2015]软件包管理器
Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...
- [HEOI2015]小Z的房间
Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...
- ●UVa 11346 Probability
题链: https://vjudge.net/problem/UVA-11346题解: 连续概率,积分 由于对称性,我们只用考虑第一象限即可. 如果要使得面积大于S,即xy>S, 那么可以选取的 ...
- 洛谷4月月赛R1
T1.题目大意:n个人站成一排,有m个团队,每个人有且属于一个团队,可以让若干个人出队,任意交换这些人的位置后再站回去,问要让所有同一团队的人连续地站在一起,至少要出队几个.(n<=10^5,m ...
- poj 2528 (线段树+离散化)
poj 2528 For each input data set print the number of visible posters after all the posters are place ...
- 51Nod 1196 字符串的数量
用N个不同的字符(编号1 - N),组成一个字符串,有如下要求: (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以 ...
- Hdu 5595 GTW likes math
题意: 问题描述 某一天,GTW听了数学特级教师金龙鱼的课之后,开始做数学<从自主招生到竞赛>.然而书里的题目太多了,GTW还有很多事情要忙(比如把妹),于是他把那些题目交给了你.每一道题 ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...