jar包官网
jar包官网jar下载地址:
https://repo.spring.io/libs-release-local/org/springframework/spring/
一、IOC概念
1.IOC控制反转(Inversion of Control): 控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。就是把对象的创建、初始化、销毁等工作交给spring容器来做,由spring容器来控制对象的生命周期。这主要是一个概念,是一种思想。
2.DI依赖注入(Dependency Injection): 是指程序运行过程中,若需要调用另一个对象协助时,无需在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起
**3.IOC与DI的关系:**IOC是一个概念,是一种思想,其实现方式多种多样,当前比较流行的实现方式之一是DI
二、XML配置方式
(一)普通构造注入
? 1.创建一个普通的Java工程,创建好Bean类User类和创建Junit测试类(Eclipse需要配置相应Spring插件)
public class User {
public User(){
System.out.println("调用了无参构造方法");
}
public void fly(){
System.out.println("阁下何不同风起,扶摇直上九万里");
}
}
? 2.导入jar包(context,core,expression,beans和依赖jar包commons.logging)
? 3.创建Spring的XML配置文件applicationContext.xml(声明User Bean:将自己信息告诉Spring容器,例如id和class,Spring容器根据class,通过反射对象)
<?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.xsd">
<!-- 注册User对象 -->
<bean class="com.sxt.pojo.User" id="userId" name="userName" />
</beans>
? 4.初始化Spring容器:applicationContext.xml中配置的所有类对象都会被创建,而且该方法会调用User类的无参构造,如果没有无参构造方法,会抛出NoSuchMethodExceptiop异常
@org.junit.Test
public void test2(){
//初始化容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
}
运行结果:初始化容器会调用Bean User类的无参构造方法
? 5.可以通过容器中的getBean方法获取Spring容器中创建好的对象:id和name
@org.junit.Test
public void test2(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//调用了无参构造方法
//根据id获取对象
User user1 = (User)ac.getBean("userId");
//根据name获取对象
User user2 = (User) ac.getBean("userName");
user1.fly();//阁下何不同风起,扶摇直上九万里
user2.fly();//阁下何不同风起,扶摇直上九万里
}
运行结果:根据id和name都能获取到User对象
? 6.除了id和name之外,getBean还有其他重载方法可以获取Spring容器中的对象
@org.junit.Test
public void test3(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//根据User类的class类,如果applicationContext.xml文件中有2个User类的声明用该方法会报错
User user = ac.getBean(User.class);
user.fly();
//根据class类和id或name属性获取对象
User user2 = ac.getBean("userId", User.class);
user2.fly();
}
运行结果:
? 7.id和name的区别:在同一配置文件中ID不要出现重复的
id=“userID1,userID2,userID3”: 表示bean有一个名字,这个名字就是userID1,userID2,userID3
name=“user1,user2,user3”: 表示bean有多个名字,多个名字分别是user1、user2以及user3
<!-- applicationContext.xml -->
<!-- 注册User对象 -->
<bean class="com.sxt.pojo.User" id="userID1,userID2,userID3" name="user1,user2,user3" />
? 8.BeanFactory和ApplicationContext的区别:
/**
* 4.ApplicationContext方式加载
*/
public void test4(){
//创建容器的同时,容器初始化,容器所有的bean创建完毕
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//去Spring容器中获取一个User对象
User user = ac.getBean(User.class);
user.fly();
}
/**
* 5.BeanFactory方式加载,下面已过时
*/
public void test5(){
//创建容器对象,BeanFactory当调用getBean获取响应对象时才创建对象
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("application.xml"));
//去Spring容器中获取一个User对象
User user = bf.getBean(User.class);
user.fly();
}
(二)静态工厂注入
? 1.创建静态工厂类
/**
* User 静态工厂类
*/
public class UserFactory {
/**
* 必须是static静态方法
* @return
*/
public static User getInstance(){
return new User();
}
}
? 2.配置applicationContext.xml文件
<?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.xsd">
<!-- 注册User对象 -->
<bean class="com.sxt.factory.UserFactory" factory-method="getInstance" id="user2" />
</beans>
? 3.Junit测试类测试
@org.junit.Test
public void test6(){
//创建容器的同时,容器初始化,容器所有的bean创建完毕
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//去Spring容器中获取一个User对象
User user = ac.getBean(User.class);
user.fly();
}
(三)动态工厂注入
? 1.创建动态工厂类
/**
* User 动态工厂类
*/
public class UserFactory {
public User getInstance(){
return new User();
}
}
? 2.配置applicationContext.xml文件
<?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.xsd">
<!-- 注册User对象 -->
<bean class="com.sxt.factory.UserFactory" id="userFactory1" />
<bean id="user" factory-bean="userFactory1" factory-method="getInstance"/>
</beans>
? 3.Junit测试类测试
@org.junit.Test
public void test6(){
//创建容器的同时,容器初始化,容器所有的bean创建完毕
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//去Spring容器中获取一个User对象
User user = ac.getBean(User.class);
user.fly();
}