spring模拟ioc

时间:2023-03-09 10:05:00
spring模拟ioc
  • 非spring 开发
public class UserService {

    private UserDao userDao=new UserDaoImpl();

    public void addUser(User user){
userDao.addUser(user);
}
}
public interface UserDao {

     public void addUser(User user);
}
public class UserDaoImpl implements UserDao {

    @Override
public void addUser(User user) {
// TODO Auto-generated method stub
//保存数据 这边省略连接数据库操作代码
System.out.println("id:"+user.getId()+",name"+user.getName());
System.out.println("user save !!!");
}
}

测试代码

public class Test1 {

    private UserService userService=new UserService();
private User user; @Before
public void init(){
user=new User();
user.setId(1);
user.setName("zhangsan");
userService=new UserService();
} @Test
public void test(){
userService.addUser(user);
}
}

结果:

id---1,name---zhangsan
user save !!!
  • 模拟spring开发模式,将所有对象都放到容器中,用到的对象从容器中取
  • 所有的对象通过xml文件的形式进行配置,使用jdom读取xml文件内容

导包  读取beans.xml文件

spring模拟ioc

<beans>
<!-- 配置文件形式 配置 userdao -->
<bean id="userDao" class="com.qzzx.dao.impl.UserDaoImpl"></bean>
<!-- 配置文件形式 配置userservice -->
<bean id="userService" class="com.qzzx.service.UserServiceXml">
<property name="userDao" bean="userDao"></property>
</bean>
</beans>

beans 配置文件

public class ClassPathXmlApplicationContext implements BeanFactory{

    //定义一个容器存放bean对象
Map<String, Object> map=new HashMap<>();
/**
* 初始化容器
*/
public ClassPathXmlApplicationContext() {
//使用jdom解析 beans.xml文件
SAXBuilder sb=new SAXBuilder();
try {
//获取文档对象
Document doc = sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
//获取根节点
Element root = doc.getRootElement();
//获取所有bean节点
List childrenBean = root.getChildren("bean");
for (int i = 0; i < childrenBean.size(); i++) {
//遍历获取单个bean标签,并取得其中id和class属性的值
Element bean = (Element) childrenBean.get(i);
String id=bean.getAttributeValue("id");
String clazz=bean.getAttributeValue("class");
//打印查看
// System.out.println("id:"+id+",class:"+clazz);
//利用反射原理获得对象,并且实例化
Object obj = Class.forName(clazz).newInstance();
//将对象存到 容器中
map.put(id, obj); //模拟 依赖注入 遍历bean中的标签
List properties = bean.getChildren("property");
for (int j = 0; j < properties.size(); j++) {
Element p = (Element) properties.get(j);
String name = p.getAttributeValue("name");
String beanName = p.getAttributeValue("bean");
//获得注入对象
Object setObject = map.get(beanName); //采用 set方法将对象注入 clazz名》》set方法名》》method》》执行 method,注入
String methodName="set"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length());
// System.out.println("methodName:"+methodName);
// System.out.println("接口名字:"+setObject.getClass().getInterfaces()[0]);
Method method = obj.getClass().getMethod(methodName, setObject.getClass().getInterfaces()[0]);
method.invoke(obj, setObject);
String GetMethodName="get"+name.substring(0, 1).toUpperCase()+name.substring(1, name.length()); // Method method2= obj.getClass().getMethod(GetMethodName);
// Object invoke = method2.invoke(obj);
// System.out.println(invoke==setObject);
}
} System.out.println("对象容器:"+map);
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public Object getBean(String name) {
// TODO Auto-generated method stub
return map.get(name);
} }

bean 容器

public interface BeanFactory {

    public Object getBean(String name);

}

beanFactory

public class UserServiceXml {

    private UserDao userDao;

    public void addUser(User user){
userDao.addUser(user);
}
public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
} }

userServiceXml

public class UserDaoImpl implements UserDao {

    @Override
public void addUser(User user) {
// TODO Auto-generated method stub
//保存数据 这边省略连接数据库操作代码
System.out.println("id---"+user.getId()+",name---"+user.getName());
System.out.println("user save !!!");
}
}

userdao

public class Test2 {

    @Test
public void test2(){
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext();
UserServiceXml userServiceXml = (UserServiceXml) ac.getBean("userService");
User user=new User();
user.setId(2);
user.setName("李四");
userServiceXml.addUser(user);
} }

testSpring

对象容器:{userService=com.qzzx.service.UserServiceXml@11c836e8, userDao=com.qzzx.dao.impl.UserDaoImpl@6f8cc276}
id---2,name---李四
user save !!!