Spring&Spring MVC技术分享 - 理解IoC
作者:
22-426
,
2022-03-23 15:12:21
,
所有人可见
,
阅读 163
Spring&Spring MVC技术分享
C01_D01_Understand_IoC-理解IoC
//bean
public class Dog {
public Dog() {
System.out.println("实例化了Dog!!!");
}
public void eat() {
System.out.println("这是一只狗,狗吃骨头!");
}
}
public class Pig {
public Pig() {
System.out.println("实例化了Pig!!!");
}
public void eat() {
System.out.println("这是一只猪,猪吃饲料~");
}
}
public class Sheep {
public Sheep() {
System.out.println("实例化了Sheep!!!");
}
public void eat() {
System.out.println("这是一只羊,羊吃草……");
}
}
public class SingleDog {
public SingleDog() {
System.out.println("实例化了SingleDog!!!");
}
public void eat(){
System.out.println("这是一只单身狗,单身狗吃狗粮!");
}
}
//config-beans.xml
<!-- 这是一个spring的配置文件,读取该文件会形成一个spring容器 形成的容器管理在该文件中注册的bean -->
<!-- id属性:用于为每个bean指定一个唯一标识符,也是好方便其他bean引用它 -->
<!-- name属性:也可使用name为bean指定别名,多个别名可以用逗号等隔开 -->
<!-- class属性:指定bean的全限定类名 -->
<!-- scope用于指定一个bean的范围,有效值可以是singleton,prototype,request,session,
application,websocket -->
<!-- singleton:在该容器中,一个bean只出一个共享实例 -->
<!-- prototype:在该容器中,一个bean请求一次创建一个实例 -->
<bean id="dog" name="gou,quan" class="com.qdu.bean.Dog" scope="prototype" />
<bean id="sheep" class="com.qdu.bean.Sheep" />
<!-- 上下文容器中,默认一个bean是容器创建完就会实例化的,如果希望使用延迟加载
也就是请求一个bean的时候才实例化,将lazy-init设置为true即可 -->
<bean id="singleDog" class="com.qdu.bean.SingleDog" lazy-init="true" />
//main
* *不使用IoC,自己创建对象
public class SingleDog {
public SingleDog() {
System.out.println("实例化了SingleDog!!!");
}
public void eat(){
System.out.println("这是一只单身狗,单身狗吃狗粮!");
}
}
* *使用IoC:将对象交给Spring管理,由spring负责创建和管理对象
* *该程序使用BeanFactory这种容器,提供基本的bean管理功能和DI支持
public static void main(String[] args) {
//BeanFactory是一种低级容器,提供基本的bean管理功能和DI支持
//读取配置文件,创建一个BeanFactory容器,然后就可以通过容器获取需要的bean了
//Resource接口用于加载指定的资源文件
//Resource是个接口,不能直接实例化,需要根据文件来源使用对应的Resource实现类
Resource resource=new ClassPathResource("config/beans.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource); //1
//在BeanFactory容器中,请求一个bean的时候才会实例化该bean
//默认一个bean是单例范围,也就是在该容器中,一个bean只出一个实例
//可以根据bean的id获取bean的实例
Dog d1=(Dog)beanFactory.getBean("dog"); //2
d1.eat();
//也可根据bean的name(别名)获取bean的实例
Dog d2=(Dog)beanFactory.getBean("gou"); //3
d2.eat();
//还可以根据bean的类型获取bean实例
Dog d3=beanFactory.getBean(Dog.class); //4
d3.eat();
//也可同时根据bean的id或名称和类型获取bean实例
Dog d4=beanFactory.getBean("dog",Dog.class); //4
d4.eat();
SingleDog d5=beanFactory.getBean(SingleDog.class); //5
d5.eat();
}
* *该程序中使用了高级容器ApplicationContext<br>
public static void main(String[] args) {
// ApplicationContext是一种高级容器,如果没有特殊理由,直接用该容器即可
// 读取一个或多个spring配置文件形成一个ApplicationContext容器
// 然后可以通过该容器获取容器管理的bean
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/beans.xml");
//在上下文容器中,bean在工厂创建完后就实例化了
//而不是请求bean的时候,请求的bean的时候只是获取已经实例化的bean而已
//默认也是单例,一个bean只出一个实例
// 可以根据bean的id获取bean的实例
Dog d1 = (Dog) ctx.getBean("dog"); // 2
d1.eat();
// 也可根据bean的name(别名)获取bean的实例
Dog d2 = (Dog) ctx.getBean("gou"); // 3
d2.eat();
// 还可以根据bean的类型获取bean实例
Dog d3 = ctx.getBean(Dog.class); // 4
d3.eat();
// 也可同时根据bean的id或名称和类型获取bean实例
Dog d4 = ctx.getBean("dog", Dog.class); // 4
d4.eat();
// 快速修改变量,光标在变量周围,按下alt+shift+r ----eclipse
// 左右移动光标修改,修改后enter或esc即可
SingleDog d5 = ctx.getBean(SingleDog.class); // 4
d5.eat();
}