一、普通注入方式:
(1)在IDEA工作空间内先创建lib包然后导入Spring的架包(复制进去的架包要按住鼠标右键出现Add as Library)。
(2)在已经创建好架包的基础上在src目录下创建XML文件,文件命为applicationContext.xml,需要注意的是我们创建的是Spring Config的xml格式,假如说你导入的架包没有Add as Library的话是不会出现Spring Config的选项的。
(3)创建好xml文件后在文件中编写:
<bean class="com.lgq.Spring01.User" id="user1"/>
(注意:在里面写的是User我们先前设置好的JavaBean,并给出一个ID或者name【ID和nam的区别:ID的分号内表示bean只有一个名字,name里面有多个bean的名字,他们使用逗号分开】);
(4)创建好我们的xml文件后在src目录下创建我们的文件包(cn.sxt.Spring01);然后创建Class文件命为User;创建我们的JAVABEAN,并创建set/get以及无参构造方法。在无参构造方法中输出一句表示该Bean注入了Spring容器中。
public class User {
private Integer id;
private String name;
private String address;
public void sayHello(String name) {
System.out.println("name->"+ name);
}
(5)创建在Src目录下创建一个Class命名为Main。在Main下创建ClassPathXmlAppliccationContext类,并把创建好的xml文件路径给到它。
public class Main {
public static void main(String[] args) {
//初始化Spring容器,当Spring容器初始化时,会自动加载配置文件,然后根据配置文件中的内容初始化Bean
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//去Spring容器中,获取一个对象
User user1 = (User) ctx.getBean("user1");
user1.sayHello("张三");
}
二、静态工厂注入方式
(1)静态工厂模式实现的方式,先定义一个静态工厂的方法;
public class UserFactory {
public static User getInstance() {
return new User();
}
}
(注意:这里返回的是User这个bean,在这里new一个User())
(2)在xml中配置,配置时是通过静态工厂模式拿到JavaBean里面的字段,
<bean class="
com.lgq.Spring01.UserFactory" factory-method="getInstance" id="user2"/>
(3)测试输出
@Test
public void test3() {
User user2 = (User) ctx.getBean("user2");
user2.sayHello("zhaoliu");
}
三、实例工厂模式
(1)实例工厂注入与静态工厂注入基本一致,主要区别体现在工厂方法是不是静态方法工厂方法示例,创建实例工厂:
public class UserFactory2 {
public User getInstance() {
return new User();
}
}
(2)配置示例,配置与静态工厂的区别在于工厂模式要经过factory-bean而获取到里面的方法。而后实现控制反转。
<bean class="
com.lgq.Spring01.UserFactory2" id="userFactory2"/>
<bean class="
com.lgq.Spring01.User" factory-bean="userFactory2" factory-method="getInstance" id="user3"/>
四、属性注入
(1)构造方法注入
- 创建一个JavaBean命名为Book;并创建get/set、有参构造、重写toString等方法
public class Book {
private Integer id;
private String name;
private String author;
}
- 在xml中配置,可以通过nama赋值也可以通过index下标方式赋值
name赋值方式:
<bean class="com.itbaizhan.Book" id="book1">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="三国演义"/>
<constructor-arg name="author" value="罗贯中"/>
</bean>
index下标赋值方式:
<bean class="com.itbaizhan.Book" id="book2">
<constructor-arg index="0" value="2"/>
<constructor-arg index="1" value="红楼梦"/>
<constructor-arg index="2" value="曹雪芹"/>
</bean>
- 测试:
@Test
public void test1() {
Book book1 = (Book) ctx.getBean("book1");
System.out.println(book1);
}
@Test
public void test2() {
Book book2 = (Book) ctx.getBean("book2");
System.out.println(book2);
}
- 对象注入三种不同的配置方式;
p注入方式:ref拿到对象的属性
<bean class="com.itbaizhan.User" id="user2">
<constructor-arg name="name" value="里斯"/>
<constructor-arg name="id" value="2"/>
<constructor-arg name="address" value="广州"/>
<constructor-arg name="cat" ref="cat1"/>
</bean>
<bean class="com.itbaizhan.User" id="user3" p:id="3" p:cat-ref="cat1" p:name="王五"/> <bean class="com.itbaizhan.User" id="user1">
<property name="name" value="张三"/>
<property name="id" value="1"/>
<property name="address" value="深圳"/>
<property name="cat" ref="cat1"/>
</bean>
<bean class="com.itbaizhan.Cat" id="cat1">
<property name="id" value="1"/>
<property name="name" value="小白"/>
<property name="color" value="白色"/>
</bean>
五、数组合集合的注入方式
1、数组和集合的注入方式是一致的,无论是基本数据类型还是一个引用,注入方式都是一样。
首先声明一个对象,对象中包含集合和数组:
public class User {
private Integer id;
private String name;
private String address;
private Cat cat;
private List<String> favorites;
private Book[] books;
}
2、然后在xml文件中进行配置,五路是通过构造方法注入,还是通过set方法注入,都是使用list节点进行注入
<bean class="com.itbaizhan.User" id="user4"> <property name="address" value="广州"/> <property name="id" value="4"/> <property name="name" value="王五"/> <property name="favorites"> <list> <value>足球</value> <value>篮球</value> </list> </property> <property name="books"> <list> <bean class="com.itbaizhan.Book"> <property name="name" value="三国演义"/> <property name="id" value="1"/> </bean> <bean class="com.itbaizhan.Book"> <property name="id" value="2"/> <property name="name" value="红楼梦"/> </bean> </list> </property> </bean> <bean class="com.itbaizhan.Book" id="book1"> <property name="name" value="三国演义"/> <property name="id" value="1"/> </bean> <bean class="com.itbaizhan.Book" id="book2"> <property name="id" value="2"/> <property name="name" value="红楼梦"/> </bean> <bean class="com.itbaizhan.User" id="user5"> <property name="address" value="广州"/> <property name="id" value="4"/> <property name="name" value="王五"/> <property name="favorites"> <list> <value>足球</value> <value>篮球</value> </list> </property> <property name="books"> <list> <ref bean="book1"></ref> <ref bean="book2"></ref> </list> </property> </bean>
六、集合方式注入
1、声明Map属性,注意属性的key和value的数据类型需要提前定义好,然后在xml文件中直接使用(xml文件中配置时,key和属性的值必须要满足声明的要求,否则就会出错)。声明方式如下:
private Map<String, Object> info;
2、xml配置
<bean class="com.itbaizhan.User" id="user5"> <property name="address" value="广州"/> <property name="id" value="4"/> <property name="name" value="王五"/> <property name="favorites"> <list> <value>足球</value> <value>篮球</value> </list> </property> <property name="books"> <list> <ref bean="book1"></ref> <ref bean="book2"></ref> </list> </property> <property name="info"> <map> <entry key="age" value="99"/> <entry key="cat" value-ref="cat1"/> </map> </property> </bean>