前言:如果要快速理解仅需看贴上去的两个代码示例别的不用看,如果要继续扩充知识看下知识扩充。每个扩充都有源码!每个扩充都有源码!!每个扩充都有源码!!!
spring的IOC
IOC简单讲解
Ioc—Inversion of Control,即“控制反转”。通常程序员创建一个对象需要自己手动去new一个,既控制正转。现在交给spring的ioc容器去管理,让他帮你去new,既控制反转。
IOC快速入门案例
实体类
package com.test;
public class HelloWorld {
public void hello(){
System.out.println("hello world");
}
}
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-2.5.xsd">
<bean id="helloWorld" class="com.test.HelloWorld"></bean>
</beans>
测试类
package com.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloWorldTest {
@Test
public void testHelloWorld(){
//启动spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//根据id把spring容器中的bean提取出来了
HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
helloWorld.hello();
}
}
运行结果
例子简介
从例子中可以感受到,我们不需要自己去new一个HelloWorld对象,而是通过ClassPathXmlApplicationContext这个对象从spring容器中获取HelloWorld对象,这就是IOC的控制反转。
IOC知识扩充
IOC创建对象的方式
(1)默认构造函数创建,既上面那个例子
(2)实例工厂方法
(3)静态工厂方法
IOC创建对象的时间
(1)默认启动spring容器的时候创建
(2)当设置lazy-init=”true”的时候,调用的时候创建
IOC创建对象的范围
(1)默认状态下为单例,既创建对象这个类的属性是全局的
(2)设置scope=”prototype”的时候,是多例的,而且 无论lazy-init是值,都是在获取bean的时候才创建对象
IOC创建对象时的初始化与销毁方法
(1)初始化方法init-method,加载spring容器的时候调用初始化方法,进行初始化。
(2)销毁方法destroy-method,spring容器关闭的时候进行调用销毁方法,进行销毁。
对象的别名alias
(1)通过使用alias=”xxx”可将一个bean起多个别名
spring的DI
DI简单讲解
DI—Dependency Injection,即“依赖注入”。依赖:应用程序依赖spring的IOC容器,注入:IOC容器注入某对象赋值。简单的可以理解为,给类的属性赋值。有了spring的IOC容器,我们不用自己在程序中手动去赋值,可以交给spring的IOC容器去赋值,这样我们无须知道怎么赋值,赋的什么值,可以将注意力集中在业务逻辑中。
DI快速入门案例
实体类
package com.test;
public class Person {
private Long pid;
private String name;
/*get set省略*/
}
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-2.5.xsd">
<bean id="person" class="com.test.Person">
<property name="pid" value="1"></property>
<property name="name" value="狗蛋"></property>
</bean>
</beans>
测试类
package com.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DTXMLTest {
@Test
public void testDI_XML_Setter(){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person)context.getBean("person");
System.out.println(person.getName());
System.out.println(person.getPid());
}
}
运行结果
例子简介
从例子中可以看出,我们在应用程序中并没有对属性赋值,直接就能得到类的值。应为spring容器在加载的时候已经对类的属性进行了赋值,类的属性可以是类,可以是集合,数组等。这就是依赖注入,也就是给属性赋值。
DI知识扩充
依赖注入的方式
(1)通过set方法注入,既上面的小例子。
(2)通过构造器注入。
(3)父类与子类之间的赋值。
进一步补充(可忽略)
spring的IOC与DI注解形式
(1)di的注解形式。
(2)IOC与DI的注解形式。
(1)(2)的例子可能让您对annotation-config 与
component-scan区别产生疑问,如有疑问参考博客:https://blog.csdn.net/jingyangV587/article/details/80384819
(3)IOC与DI简单的mvc(加深理解)。
项目源码:https://gitee.com/jingyang3877/spring-test
参考博客:https://blog.csdn.net/qq_22654611/article/details/52606960/