昨天写的没了真是吐了
IOC创建对象方式
1.通过无参数构造方法:
1.1 仅有无参构造方法且无属性值
建立一个Hello实体类: 里面有一个无参数构造方法
package com.lx.pojo;
public class Hello {
public Hello() {
System.out.println("Hello已被创建");
}
}
创键spring容器,beans.xml,在里头注册Hello类对象
<bean id="hello" name="h1 h2,h3;h4" class="com.lx.pojo.Hello">
测试单元:
@Test
public void testhello(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
}
测试结果:
我们在创建这个容器中,并没有在测试类中创建hello对象,但Hello中的无参构造方法输出了,
证明对象是有Spring容器创建的,在读取[spring].xml文件时创建的
1.2 仅有无参数构造方法,且有属性
创建一个实体类:
package com.lx.pojo;
public class User {
private String name;
//仅有无参数构造方法
public User() {
System.out.println("User的无参数构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Name="+this.name);
}
}
在bean中,可以通过无参直接创建不赋值,也可以创建时通过property对属性赋值
<bean id="user" class="com.lx.pojo.User"/>
<bean id="user1" class="com.lx.pojo.User">
<property name="name" value="user1"/>
</bean>
测试单元:
@Test
public void testUser(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("==============");
User user = context.getBean("user", User.class);
user.show();
System.out.println("=========");
User user1 = context.getBean("user1", User.class);
user1.show();
}
测试结果:
一个为null,一个为user1
bean注入依赖于set方法,所以属性必须要有set方法
2. 通过有参数构造方法
2.1 仅有有参构造方法 有参那必须要有属性啊
创建一个实体类:
package com.lx.pojo;
public class User1 {
private String name;
//仅有有参数构造方法
public User1(String name) {
System.out.println("User1的有参数构造方法");
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Name="+this.name);
}
}
在bean中通过constructor-arg 有参构造 必须要用constructor-arg,因为只有有参改造方法
<bean id="userone" class="com.lx.pojo.User1">
<constructor-arg name="name" value="lx-User1"/>
</bean>
测试单元:
@Test
public void testUser1(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User1 userone = context.getBean("userone", User1.class);
userone.show();
}
测试结果:
有参的三种构造方式
2.2 有参构造且同时有无参构造
其实就是既可以用property进行无参属性注入,也可以用有参的construct-arg下面着重介绍有参的三种构造方式
创建一个实体类:
package com.lx.pojo;
public class User2 {
private int id;
private String name;
private String Address;
public User2() {
System.out.println("User2的无参数构造方法");
}
public User2(int id, String name, String address) {
System.out.println("User2的有参数构造方法");
this.id = id;
this.name = name;
Address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
public void show(){
System.out.println("Name="+this.name);
}
@Override
public String toString() {
return "User2{" +
"id=" + id +
", name='" + name + '\'' +
", Address='" + Address + '\'' +
'}';
}
}
在bean中注册:
2.2.1 第一种 根据参数名字 ★★★★★★
有参构造constructor-arg - name -value 推荐简单好用可读性强
<bean id="User2ByName" class="com.lx.pojo.User2">
<constructor-arg name="id" value="233"/>
<constructor-arg name="name" value="通过name属性赋值"/>
<constructor-arg name="address" value="无家可归"/>
</bean>
2.2.2 第二种 根据参数下标
通过有参构造属性的顺序,进行赋值 constructor-arg - index - value
一般 不咋好用
<bean id="User2ByIndex" class="com.lx.pojo.User2">
<constructor-arg index="0" value="250"/>
<constructor-arg index="1" value="通过下标赋值"/>
<constructor-arg index="2" value="无家可归"/>
</bean>
2.2.3 第三种 根据参数类型 不推荐
就这样根据type,碰上多个相同类型的还是需要根据参数下标顺序 可读性不好还乱,个人不推荐
<bean id="User2ByType" class="com.lx.pojo.User2">
<constructor-arg type="int" value="250"/>
<constructor-arg type="java.lang.String" value="通过参数类型赋值"/>
<constructor-arg type="java.lang.String" value="无家可归2"/>
</bean>
测试单元:
@Test
public void testUser2(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
System.out.println("\n");
User2 user2ByName = context.getBean("User2ByName", User2.class);
System.out.println(user2ByName.toString());
System.out.println("\n");
User2 user2ByIndex = context.getBean("User2ByIndex", User2.class);
System.out.println(user2ByIndex.toString());
System.out.println("\n");
User2 user2ByType = context.getBean("User2ByType", User2.class);
System.out.println(user2ByType.toString());
}
测试结果:
Spring的配置
别名
alias 设置别名 , 为bean设置别名 , 可以设置多个别名
<alias name="User2ByName" alias="哈哈"/>
@Test
public void testhaha(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User2 哈哈 = context.getBean("哈哈", User2.class);
System.out.println(哈哈.toString());
}
Bean的配置
- id 是bean的标识符,要唯一,
- 如果没有配置id,name就是默认标识符
- 如果配置id,又配置了name,那么name是别名 name可以设置多个别名,可以用逗号,分号,空格隔开
- 如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;
- class是bean的全限定名=包名+类名
<bean id="User2" name="u user2,u2;us2" class="com.lx.pojo.User2">
<property name="name" value="usertwo3"/>
<property name="id" value="1111"/>
<property name="address" value="name的别名设置"/>
</bean>
@Test
public void testname(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User2 u3 = context.getBean("u3", User2.class);
System.out.println(u3.toString());
}
import
团队的合作通过import来实现 .
<import resource="{path}/beans.xml"/>