查看本文 需要您使用spring创建过对象管理 如果之前没有接触过 可以先查看我的文章
java 手把手带你创建一个spring入门案例
IOC 操作中 Bean管理主要有两个部分
分别是创建对象和注入属性
他们都有两种实现方式 分别是xml和注解方式实现
本文只演示xml 后续我会出注解方式的文章可以留意一下
创建对象我们入门案例里已经做过了
通过xml文件配置
在工厂类中读取配置并反射创建
其中 我们要对 xml bean的属性 做个解释
id 并不是你要应用的这个对象名字 而是 你在xml创建类对象时 给他取一个别名 到时 类或通过这个别名找到他
class 则是要你要创建对象这个类的全路径 包/类
例如我们这里 gettingStarted包下的user类
而反射创建对象时 spring也会去找到这个无参的构造方法
比如 我们打开我们之前的入门案例 在user类中创建一个有参的构造方法 这样 原本那个无参的构造方法就没了
我们再次运行项目
这样我们项目就报异常了 找不到他默认要找的这个无参构造了
这也是bean创建对象的特点之一 会找到默认的 无参构造方法 通过它创建对象
然后是我们的第二个点 属性注入
DI 有些人面试会问 DI和IOC的区别 而DI是IOC的一种具体实现 代表 注入依赖,就是注入属性
按原始的做法 就是在一个类中创建一个属性 然后给这个属性设置一个set方法 从外面赋值 或者是 定义一个属性和一个有参构造 通过构造方法 从外面把值传进去
其实spring中也是主要通过他们来实现
下面我们就来用代码演示一下具体配置
首先是set方法的实现
我们先创建一个项目 然后引入spring需要的几个基本的JAR包
然后在src下创建一个包 叫 gettingStarted
包下创建一个user类 参考代码如下
package gettingStarted;
public class user {
public String name;
public int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
可以看到 我们这里定义了两个属性 name:用户名称 age:用户年龄 并分别给他们定义了 get和set方法
然后 在src下创建一个 bean.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">
<!-- user类的对象创建 -->
<bean id = "user" class = "gettingStarted.user">
<property name="name" value = "小猫猫"></property>
<property name="age" value = "13"></property>
</bean>
</beans>
这里 我们先通过bean标签 创建了user类的对象 然后通过property给name和age注入了值 name代表对应类中的哪个一属性 value代表需要注入的值
认真看一下还是很好理解的
然后我们在src下的gettingStarted创建一个测试类 text
参考代码如下
package gettingStarted;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class text {
public static void main(String args[]) {
//获取配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
user user = context.getBean("user",user.class);
System.out.println(user.getName());
System.out.println(user.getAge());
}
}
可以看到 我们还是用了基本的反射方法 创建了这个类的对象 然后调用两个get方法 将结果用System.out.println输出在控制台上 看看我们在xml中定义的属性注入进去没有
我们运行结果如下
这里也是没有任何问题
这就是Bean管理通过 set注入属性的方法 然后我们来看有参构造的注入方式
还是刚才的代码
我们给user类加一个构造方法 参考代码如下
public user(String name,int age){
this.name = name;
this.age = age;
}
这次 我们将通过它给属性赋值
修改 bean.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">
<!-- user类的对象创建 -->
<bean id = "user" class = "gettingStarted.user">
<constructor-arg name = "name" value = "小猫猫"></constructor-arg>
<constructor-arg name = "age" value = "13"></constructor-arg>
</bean>
</beans>
还是通过bean创建对象 但如果你用了构造方法 那就要通过constructor-arg标签 写明构造方法的传值 name代表你要给那个属性 value则是对应的值是什么
测试类就还是一样的用法
运行结果如下
也是没有任何问题
不过我们构造方法注入属性 xml还有另一种写法
我们将 bean 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">
<!-- user类的对象创建 -->
<bean id = "user" class = "gettingStarted.user">
<constructor-arg index = "0" value = "小猫猫"></constructor-arg>
<constructor-arg index = "1" value = "13"></constructor-arg>
</bean>
</beans>
这样写运行效果也是一样的 index 代表你要给构造方法中的第几个参数赋值 索引都是从0开始的 所以 我们0找到了 第一个name 而1 找到了第二个age
一个是通过属性名 另一个是通过第几个找到属性并赋值 也都差不多
到这里 我们xml完成 Bean管理的操作就演示完啦