写点什么

Spring 学习总结:IOC 基础 (1),java 反射面试题及答案

用户头像
极客good
关注
发布于: 刚刚

package com.kevin.spring.demo2.test;


import com.kevin.spring.demo2.entity.Person;


import com.kevin.spring.demo2.entity.Student;


import org.springframework.context.ApplicationContext;


import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test {


public static void main(String[] args) {


ApplicationContext ctx = new ClassPathXmlApplicationContext("student.xml");


Person kevin = ctx.getBean("kevin", Student.class);


Person maomao = ctx.getBean("maomao", Student.class);


System.out.println(maomao);


System.out.println(kevin);


}


}


输出


信息: Loading XML bean definitions from class path resource [student.xml]


Student{height=100, name='maomao'}


Student{height=170, name='kevin'}


通过属性赋值


Animal


package com.kevin.spring.demo3.entity;


/**


  • 动物


*/


public class Animal {


/**


  • 动物名称


*/


private String name;


public Animal() {


}


public Animal(String name) {


this.name = name;


}


public String getName() {


return name;


}


public void setName(String name) {


this.name = name;


}


@Override


public String toString() {


return "Animal{" +


"name='" + name + ''' +


'}';


}


}


animal.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"


xmlns:p="http://www.springframework.org/schema/p"


xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<bean id="dog" class="com.kevin.spring.demo3.entity.Animal">


<property name="name" value="dog"></property>


</bean>


<bean id="cat" class="com.kevin.spring.demo3.entity.Animal" p:name="cat"></bean>


</beans>


测试


package com.kevin.spring.demo3.test;


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


import com.kevin.spring.demo3.entity.Animal;


import org.springframework.context.ApplicationContext;


import org.springframework.context.support.ClassPathXmlApplicationContext;


/**


  • 测试类


*/


public class Test {


public static void main(String[] args) {


ApplicationContext ctx = new ClassPathXmlApplicationContext("animal.xml");


Animal dog = ctx.getBean("dog",Animal.class);


Animal cat = ctx.getBean("cat",Animal.class);


System.out.println(cat);


System.out.println(dog);


}


}


输出结果


信息: Loading XML bean definitions from class path resource [animal.xml]


Animal{name='cat'}


Animal{name='dog'}


对象引用


Tyre


package com.kevin.spring.demo4.entity;


/**


  • 轮胎

  • @author: kevin

  • @Date: 2018/12/8


*/


public class Tyre {


private String name;


public Tyre(String name) {


this.name = name;


}


public String getName() {


return name;


}


public void setName(String name) {


this.name = name;


}


@Override


public String toString() {


return "Tyre{" +


"name='" + name + ''' +


'}';


}


}


Car


package com.kevin.spring.demo4.entity;


/**



*/


public class Car {


private String name;


private Tyre tyre;


public Car(String name, Tyre tyre) {


this.name = name;


this.tyre = tyre;


}


public String getName() {


return name;


}


public void setName(String name) {


this.name = name;


}


public Tyre getTyre() {


return tyre;


}


public void setTyre(Tyre tyre) {


this.tyre = tyre;


}


@Override


public String toString() {


return "Car{" +


"name='" + name + ''' +


", tyre=" + tyre +


'}';


}


}


测试


package com.kevin.spring.demo4.test;


import com.kevin.spring.demo4.entity.Car;


import org.springframework.context.ApplicationContext;


import org.springframework.context.support.ClassPathXmlApplicationContext;


public class Test {


public static void main(String[] args) {


ApplicationContext ctx = new ClassPathXmlApplicationContext("car.xml");


Car bike = ctx.getBean("bike", Car.class);


System.out.println(bike);


}


}


输出结果


信息: Loading XML bean definitions from class path resource [car.xml]


Car{name='bike', tyre=Tyre{name='自行车轮胎'}}


对象作用域


在大多数情况下,单例 bean 是很理想的方案。初始化和垃圾回收对象实例所带来的的成本只留给一些小规模任务,在这些任务中,让对象保持无状态并且在应用中反复重用这些对象可能并不合理。在这种情况下,将 class 声明为单例的 bean 会被污染,稍后重用的时候会出现意想不到的问题。 -《spring 实战》


Spring 定义了多种作用域,可以基于这些作用域创建 bean,包括:


| 作用域 | 描述 |


| --- | --- |


| 单例(Singleton) | 在整个应用中,只创建 bean 的一个实例 |


| 原型(Prototype) | 每次注入或者通过 spring 应用上下文获取的时候,都会创建一个新的 bean 实例 |


| 会话(Session) | 在 web 应用中,为每个会话创建一个 bean 实例 |


| 请求(Request) | 在 web 应用中,为每个请求创建一个 bean 实例 |


1、spring 中默认是单例的,我们通过之前的代码演示下


<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xmlns:p="http://www.springframework.org/schema/p"


xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<bean id="dog" class="com.kevin.spring.demo3.entity.Animal">


<property name="name" value="dog"></property>


</bean>


<bean id="cat" class="com.kevin.spring.demo3.entity.Animal" p:name="cat"></bean>


</beans>


测试


package com.kevin.spring.demo3.test;


import com.kevin.spring.demo3.entity.Animal;


import org.springframework.context.ApplicationContext;


import org.springframework.context.support.ClassPathXmlApplicationContext;


/**


  • 测试类


*/


public class Test {


public static void main(String[] args) {


ApplicationContext ctx = new ClassPathXmlApplicationContext("animal.xml");


Animal dog1 = ctx.getBean("dog",Animal.class);


Animal dog2 = ctx.getBean("dog",Animal.class);


System.out.println(dog1 == dog2);


}


}


输出结果


true


这样验证了从容器中取回的对象默认是单例的。


2、设置成 Prototype


<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xmlns:p="http://www.springframework.org/schema/p"


xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<bean id="dog" class="com.kevin.spring.demo3.entity.Animal" scope="prototype">


<property name="name" value="dog"></property>


</bean>


<bean id="cat" class="com.kevin.spring.demo3.entity.Animal" p:name="cat"></bean>


</beans>


测试


ApplicationContext ctx = new ClassPathXmlApplicationContext("animal.xml");


Animal dog1 = ctx.getBean("dog",Animal.class);


Animal dog2 = ctx.getBean("dog",Animal.class);


System.out.println(dog1 == dog2);


输出结果


false


延迟初始化 bean


ApplicationContext 实现的默认行为是在启动时将所有的 singleton bean 提前进行实例化。这样配置中或者运行环境的错误就会立刻发现。如果你想延迟初始化。可以在 xml 中进行配置


<bean id="kevin" class="com.kevin.spring.demo2.entity.Student" lazy-init="true">


<constructor-arg name="name" value="kevin"></constructor-arg>


<constructor-arg name="height" value="170"></constructor-arg>


</bean>


测试


public static void main(String[] args) throws InterruptedException {


ApplicationContext ctx = new ClassPathXmlApplicationContext("student.xml");


Thread.sleep(3000);


Person kevin = ctx.getBean("kevin", Student.class);


System.out.println(kevin);


}


大家自己运行后发现,确实并不是启动后就加载的。


回调方法


Student


public void init() {


System.out.println("执行 init 方法");


}

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Spring学习总结:IOC基础(1),java反射面试题及答案