知识点:xml文件解析,java反射。
配置文件test1.xml
<?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 id="userDao" class="com.myspring.day2.myioc.UserDaoImpl" />
<bean id="userService" class="com.myspring.day2.myioc.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao" />
</bean>
<bean id="client" class="com.myspring.day2.myioc.Client">
<constructor-arg name="userService" ref="userService" />
</bean>
</beans>
配置文件test2.xml
<?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 id="user" class="com.myspring.day1.bean.User">
<property name="id" value="1008611"></property>
<property name="name" value="liuzhonglin"></property>
</bean>
</beans>
myioc
1.通过反射使用构造器实现
package com.myspring.day2.myioc;
import com.myspring.day1.bean.User;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BeanFactory {
private static Map<String,Object> beanMap=new HashMap<>();
public static Object getBean(String beanName) throws Exception {
return beanMap.get(beanName);
}
public static void refresh(String filePath) throws Exception{
SAXReader saxReader=new SAXReader();
URL url=BeanFactory.class.getClassLoader().getResource(filePath);
Document document = saxReader.read(url);
Element rootElement = document.getRootElement();
List<Element> elements = rootElement.elements();
for(Element e0:elements){
xmlParse(e0);
}
}
public static void xmlParse(Element e0) throws Exception{
String id=e0.attributeValue("id");
String className=e0.attributeValue("class");
List<Element> elements1 = e0.elements();
if(elements1.size()==0){
Class<?> cls=Class.forName(className);
Object o=cls.newInstance();
beanMap.put(id,o);
}else {
Class<?>[] paramType=new Class[elements1.size()];
Object[] params=new Object[elements1.size()];
for (int i=0;i<elements1.size();i++){
String ref=elements1.get(i).attributeValue("ref");
Object param=beanMap.get(ref);
params[i]=param;
paramType[i]=param.getClass().getInterfaces()[0];
}
Object o=Class.forName(className)
.getDeclaredConstructor(paramType)
.newInstance(params);
beanMap.put(id,o);
}
}
public static void main(String[] args) throws Exception{
BeanFactory.refresh("test1.xml");
Client client = (Client) BeanFactory.getBean("client");
client.add(new User("lzlsb","1999"));
}
}
2.通过反射使用fields实现
public static void xmlParse(Element e0) throws Exception{
String id=e0.attributeValue("id");
String className=e0.attributeValue("class");
List<Element> elements1 = e0.elements();
if(elements1.size()==0){
Class<?> cls=Class.forName(className);
Object o=cls.newInstance();
beanMap.put(id,o);
}else {
Class<?> cls=Class.forName(className);
Object o=Class.forName(className)
.newInstance();
for (int i=0;i<elements1.size();i++){
String name=elements1.get(i).attributeValue("name");
String value=elements1.get(i).attributeValue("value");
Field field = cls.getDeclaredField(name);
field.setAccessible(true);
field.set(o,value);
}
beanMap.put(id,o);
}
}
3.通过反射使用methods实现
public static void xmlParse(Element e0) throws Exception{
String id=e0.attributeValue("id");
String className=e0.attributeValue("class");
List<Element> elements1 = e0.elements();
if(elements1.size()==0){
Class<?> cls=Class.forName(className);
Object o=cls.newInstance();
beanMap.put(id,o);
}else {
Class<?> cls=Class.forName(className);
Object o=Class.forName(className)
.newInstance();
for (int i=0;i<elements1.size();i++){
String name=elements1.get(i).attributeValue("name");
String value=elements1.get(i).attributeValue("value");
name="set"+name.substring(0,1).toUpperCase()+name.substring(1,name.length());
Method method = cls.getMethod(name,String.class);
method.invoke(o,value);
}
beanMap.put(id,o);
}
}
其他的普通类:
public class UserDaoImpl implements UserDao {
public void addUser(User user) {
System.out.println("add user successful :"+user.toString());
}
}
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUser(User user) {
userDao.addUser(user);
}
}
public class Client {
private UserService userService;
public Client(UserService userService) {
this.userService = userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void add(User user){
userService.addUser(user);
}
public static void main(String[] args) {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User) context.getBean("user");
Client client=(Client) context.getBean("client");
client.userService.addUser(user);
}
}