目标: 理解Spring IOC,DI
注: 面向有开发经验的,小白应该看不懂
错误: JUnit版本与语句不对应导致代码正确,运行错误
知识点
控制反转:IOC——Inversion of Control,指的是将对象的创建权交给Spring去创建。使用Spring之前,对象的创建都是由我们自己在代码中new创建。而使用Spring之后。对象的创建都是由给了Spring框架。
依赖注入:DI——Dependency Injection,是指依赖的对象不需要手动调用setXX方法去设置,而是通过配置赋值。
简单案例
目标: 通过实操person对象理解Spring的自动注入
注: 代码是参考,不是全部实现
private int id;
private String name;
private String phone;
private int age;
<!-- spring ioc配置对象 -->
<bean id="p1" class="top.starrylsi.pojo.Person">
<!-- 注入属性 -->
<property name="id" value="1001" />
<property name="name" value="azrail" />
<property name="age" value="23" />
<property name="phone" value="18310720233" />
</bean>
@Test
public void testIOC() {
//1.获取spring容器对象
ApplicationContext application = new ClassPathXmlApplicationContext("classpath:spring.xml");
// ApplicationContext application = new FileSystemXmlApplicationContext("config/spring.xml");
//2.spring容器获取对象
Person person = (Person) application.getBean("p1");
Person person1 = (Person) application.getBean("p1");
Person person2 = (Person) application.getBean("p1");
//3.显示内容
System.out.println(person);
System.out.println(person1);
System.out.println(person2);
((ClassPathXmlApplicationContext)application).close();
}
/*
* 通过类型寻找bean对象 如果spring容器中含有多个 则报错
* 只有一个则返回
*
* */
1.1 命名空间p操作参数
注: 需要通过命名空间中勾选 p,然后生成到xml中,才可以使用
<!-- 命名空间p 用于操作参数 -->
<bean id="p4" class="top.Starrylsi.pojo.Person" p:id="1004" p:name="test03" p:age="18" p:phone="19111112222" />
1.2 Person对象包含Car对象(IOC之子对象的赋值)
分析: 有两种方法可以实现
- 内部创建bean
引用外部bean
常见错误:内部的Bean不能被外部使用public class Car { private int id; private String name; public class Person { private int id; private String name; private String phone; private int age; private Car car;
<!-- 先创建一个内部对象 --> <bean id="c1" class="com.zhuama.pojo.Car"> <property name="id" value="10001" /> <property name="name" value="麦昆" /> </bean> <!-- 1.创建一个person对象 包含car对象 --> <bean id="p5" class="com.zhuama.pojo.Person"> <property name="id" value="1005" /> <property name="name" value="test04" /> <property name="age" value="23" /> <property name="phone" value="18312345678" /> <!-- 引用其他的bean 注:内部创建的bean不能被其他bean引用--> <property name="car" ref="c1" /> </bean> <!-- 2.创建一个person对象 包含car对象 --> <bean id="p6" class="com.zhuama.pojo.Person"> <property name="id" value="1006" /> <property name="name" value="test05" /> <property name="age" value="23" /> <property name="phone" value="18312345678" /> <!-- 创建内部bean --> <property name="car"> <bean id="innerCar" class="com.zhuama.pojo.Car"> <property name="id" value="10002" /> <property name="name" value="马自达" /> </bean> </property> </bean>
1.3 list map properties(了解即可)
private List<Integer> list;
private Map<String,Object> map;
private Properties prop;
<!-- bean中含有集合类型 -->
<bean id="p7" class="com.zhuama.pojo.Person">
<property name="id" value="1007" />
<!-- 如果属性是list类型 -->
<property name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<!-- 如果属性是map类型 -->
<property name="map">
<map>
<entry key="key1" value="value1" />
<entry key="key2" value="value2" />
<entry key="key3" value="value3" />
</map>
</property>
<!-- 如果属性是properties类型 -->
<property name="prop">
<props>
<prop key="driverClassName">com.mysql.driver.Driver</prop>
<prop key="url">jdbc:mysql://localhost:3306/test</prop>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
1.4 IOC之级联属性赋值
<bean id="p13" class="com.zhuama.pojo.Person">
<property name="name" value="这是12个Person" />
<!-- 先赋值 -->
<property name="car" ref="car1"></property>
<!-- 再级联修改属性 -->
<property name="car.id" value="2" />
<property name="car.name" value="级联属性赋值" />
</bean>
1.5 下面是不常用,仅了解即可
IOC之静态工厂方法创建Bean
IOC之工厂实例方法创建Bean
IOC之FactoryBean接口方式创建对象
IOC之继承Bean配置
评论 (0)