DI注入以及c、p命名空间
编写实体类
Address
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
private String address;
}
Student
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String, String> card;
private Set<String> games;
private String wife;
private Properties info;
}
User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
}
将实体类都注入到bean中,编程一个个bean
p命名空间、c命名空间
userbean.xml 用于将实体类User注入到spring容器中,交给spring托管
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- p 命名空间注入,可以直接注入属性的值 property-->
<bean id="user" class="com.kk.pojo.User" p:name="王五" p:age="22"/>
<!-- c 命名空间注入 需要构造器 construct-args -->
<!-- singleton 单例模式 Spring的默认机制-->
<!-- prototype原型模式 每次从容器中get的时候,每一次都会产生一个新对象 -->
<bean id="user2" class="com.kk.pojo.User" c:name="赵六" c:age="20" scope="prototype"/>
</beans>
注意:需要导入以下xmlns
xmlns:p="http://www.springframework.org/schema/p
xmlns:c="http://www.springframework.org/schema/c
p命名空间
p 命名空间注入,可以直接注入属性的值 property
c命名空间
c 命名空间注入 需要构造器 construct-args
singleton 单例模式 Spring的默认机制
prototype原型模式 每次从容器中get的时候,每一次都会产生一个新对象
测试各种类型的注入
仔细阅读注解
beans.xml 用于将实体类Address,Student注入到spring容器中,交给spring托管
<?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-3.0.xsd">
<bean id="address" class="com.kk.pojo.Address">
<property name="address" value="广东"/>
</bean>
<bean id="student" class="com.kk.pojo.Student">
<!-- 第一种:普通值注入,使用value注入-->
<property name="name" value="小六"/>
<!-- 第二种:bean注入,使用ref,其中name里边的参数是写bean中的id参数-->
<property name="address" ref="address"/>
<!-- 数组注入-->
<property name="books">
<array>
<value>Java程序设计</value>
<value>SSM</value>
<value>微服务</value>
</array>
</property>
<!-- List注入-->
<property name="hobbys">
<list>
<value>敲代码</value>
<value>赚钱</value>
<value>唱歌</value>
<value>运动</value>
</list>
</property>
<!-- map注入-->
<property name="card">
<map>
<entry key="学号" value="2011101**"/>
<entry key="身份证" value="4418 **** **** ****..."/>
</map>
</property>
<!-- set注入-->
<property name="games">
<set>
<value>CSOL</value>
<value>王者</value>
</set>
</property>
<!-- 空 null 注入-->
<property name="wife">
<null/>
</property>
<!-- Properties注入-->
<property name="info">
<props>
<prop key="邮箱">30666@qq.com</prop>
<prop key="qq">30666</prop>
<prop key="性别">男</prop>
</props>
</property>
</bean>
</beans>
property中的name里边的参数对应的是实体类中的属性字段
测试:
public class Test {
@org.junit.Test
public void testAddress(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Address address = (Address) context.getBean("address");
System.out.println(address);
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.toString());
}
@org.junit.Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("userbean.xml");
User user = context.getBean("user", User.class);
User user2 = context.getBean("user2", User.class);
System.out.println(user==user2);//结果为 false 这就是单例模式 singleton
}
}