p命名和c命名注入
1.p命名空间注入
User.java :【注意:这里没有有参构造器!】
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
xml
!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
<!-- p->property 单例模式 -->
<!--p命名空间注入 可以直接注入属性的值 p就是属性p-->
<bean id="user0" class="com.q.pojo.User" p:name="lin" p:age="20"/>
2、c 命名空间注入 : 需要在头文件中加入约束文件
<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->
<!-- c->constructor-arg 作用域 为Prototype 也就是作用域为原型模式 -->
<bean id="user2" name="user" class="com.q.pojo.User" c:age="10" c:name="ljq" scope="prototype"/>
发现问题:爆红了
解决:把有参构造器加上,这里也能知道,c 就是所谓的构造器注入!
public User(String name, int age) {
this.name = name;
this.age = age;
}
测试:
@Test
public void test01() {
// p命名空间注入测试
ApplicationContext context = new ClassPathXmlApplicationContext("UserBeans.xml");
//第一种方式,需要强转
User user = (User) context.getBean("user");
//第二种方式,不用强转
User user1 = context.getBean("user2", User.class);
System.out.println(user1.toString());
// c命名空间注入
User user2 = context.getBean("user2", User.class);
System.out.println(user2.toString());
System.out.println(user1 == user2);
}
测试结果:
User{name='ljq', age=10}
User{name='ljq', age=10}
false
完整:
<?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.xsd">
<import resource="beans.xml"/>
<!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
<!-- p->property 单例模式 -->
<!--p命名空间注入 可以直接注入属性的值 p就是属性p-->
<bean id="user0" class="com.q.pojo.User" p:name="lin" p:age="20"/>
<!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->
<!-- c->constructor-arg 作用域 为Prototype 也就是作用域为原型模式 -->
<bean id="user2" name="user" class="com.q.pojo.User" c:age="10" c:name="ljq" scope="prototype"/>
</beans>