官网
package com.sxs.spring.bean; /** * Entity * @author 孙显圣 * @version 1.0 */ public class Monster { private Integer monsterId; private String name; private String skill; //无参构造器,一定要给,底层是反射创建对象 public Monster() {} public Monster(Integer monsterId, String name, String skill) { this.monsterId = monsterId; this.name = name; this.skill = skill; } public Integer getMonsterId() { return monsterId; } public void setMonsterId(Integer monsterId) { this.monsterId = monsterId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } @Override public String toString() { return "Monster{" + "monsterId=" + monsterId + ", name='" + name + '\'' + ", skill='" + skill + '\'' + '}'; } }
package com.sxs.spring.test; import com.sxs.spring.bean.Monster; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author 孙显圣 * @version 1.0 */ public class SpringBeanTest { @Test public void getMonster() { //创建容器ApplicationContext,该容器是对应于一个xml配置文件 ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); //第一种获取bean对象的方式 //1.直接获取配置文件中的bean对象,不指定泛型 Object monster01 = ioc.getBean("monster01"); //2.这是一个Object类型的方法,指向一个monster类型的对象,所以需要向下转型 Monster monster = (Monster) monster01; //3.输出信息 System.out.println(monster); //第二种获取bean对象的方式 //1.获取配置文件中的bean对象,指定泛型,则这个方法就是泛型类型的 Monster monster011 = ioc.getBean("monster01", Monster.class); //2.输出信息 System.out.println(monster011); } }
//验证类加载路径 @Test public void classPath() { //输出类加载路径 System.out.println(this.getClass().getResource("/").getPath()); //所以new ClassPathXmlApplicationContext("beans.xml"); //相当于获取/D:/Intelij_IDEA_Project/spring/spring/out/production/spring/下的beans.xml }
可以看出,读取的实际是spring下面的文件,对应于项目中的src下,可以理解为在项目中src/就是类加载路径
//获取beans.xml中所有对象的id @Test public void getAllId() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); String[] beanDefinitionNames = ioc.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println(beanDefinitionName); } }
package com.sxs.spring.sxsapplicationcontext; import com.sxs.spring.bean.Monster; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.File; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 实现ApplicationContext的简单机制 * * @author 孙显圣 * @version 1.0 */ public class SxsApplicationContext { //存储单例对象的字段 private ConcurrentHashMapsingletonObjects = new ConcurrentHashMap<>(); //构造器,用于读取xml文件,默认在src下 public SxsApplicationContext(String iocBeanXmlFileName) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException { //获取类路径 String path = this.getClass().getResource("/").getPath(); //dom4j读取文件 SAXReader saxReader = new SAXReader(); Document read = saxReader.read(new File(path + iocBeanXmlFileName)); Element rootElement = read.getRootElement(); //获取二级元素的第一个 Element bean = (Element) rootElement.elements("bean").get(0); //获取属性信息 String classAllPath = bean.attributeValue("class"); String id = bean.attributeValue("id"); //获取元素信息 List property = bean.elements("property"); //遍历获取,这里直接简化一下,直接获取 Integer monsterId = Integer.parseInt(property.get(0).attributeValue("value")); String name = property.get(1).attributeValue("value"); String skill = property.get(2).attributeValue("value"); //反射创建对象Monster对象 Class> aClass = Class.forName(classAllPath); Monster o = (Monster) aClass.newInstance(); //为属性赋值 o.setMonsterId(monsterId); o.setName(name); o.setSkill(skill); //放到单例对象中 singletonObjects.put(id, o); } //提供一个getBean方法,获取id对应的bean对象 public T getBean(String id, Class aClass) { for (Map.Entry stringObjectEntry : singletonObjects.entrySet()) { if (stringObjectEntry.getKey().equals(id)) { //返回T类型的bean对象 return (T) stringObjectEntry.getValue(); } } return null; } }
package com.sxs.spring.sxsapplicationcontext; import com.sxs.spring.bean.Monster; import org.dom4j.DocumentException; /** * @author 孙显圣 * @version 1.0 */ public class SxsApplicationContextTest { public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException { SxsApplicationContext sxsApplicationContext = new SxsApplicationContext("beans.xml"); //获取bean对象 Monster monster01 = sxsApplicationContext.getBean("monster01", Monster.class); System.out.println(monster01); } }
//得到系统默认分配的id并且得到bean对象 @Test public void getDefaultIdToFindBean() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); //获取所有bean对象 String[] beanDefinitionNames = ioc.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { System.out.println(ioc.getBean(beanDefinitionName)); } }
package com.sxs.spring.bean; /** * @author 孙显圣 * @version 1.0 */ public class Car { private Integer id; private String name; private Double price; public Car() {} public Car(Integer id, String name, Double price) { this.id = id; this.name = name; this.price = price; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Car{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; } }
//得到car对象 @Test public void getCarObject() { ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml"); Car car = ioc.getBean("car", Car.class); System.out.println(car); }