问题
- 0_1.什么是自动装配,如何进行自动装配,自动装配的优缺点是什么?
- 0_2.继承 Bean 配置如何配置?若父 Bean 想作为模板该如何配置?
- 0_3.什么是依赖 Bean 配置,如何进行依赖 Bean 配置?
- 0_4.Bean 的作用域有哪些?如何配置?如何使用?默认情况下作用域是什么?
- 0_5.如何使用配置文件实现数据库的连接?
- 1.Spring表达式语言说的是什么?使用什么作为界定符?作用是什么?
- 2.通过 SpEL 可以实现哪些操作?
- 3.SpEL:字面量中可以表示哪些类型的量?分别做回忆。
- 4.如何引用Bean、属性和方法?
- 5.SpEL支持哪些运算符号?
- 6.什么可以对Bean的生命周期进行管理?
- 7.Spring IOC 容器对 Bean 的生命周期进行管理的过程是什么样的?
- 8.如何为 Bean 指定初始化和销毁方法?
- 9.如果想在创建bean前后做操作,可以做什么处理?其处理范围是什么?其典型应用是什么?如何配置?
- 10.添加Bean后置处理器之后Bean的生命周期是什么样的?
- 11.bean的创建方式有哪几种?
- 12.通过调用静态工厂方法创建 Bean的含义和特点是什么?如何通过静态工厂方法创建Bean
- 13.通过实例工厂方法创建Bean主要思想是什么?如何通过实例工厂方法创建Bean
- 14.什么是FactoryBean?FactoryBean中有哪几种方法,分别是什么?配置过程包括哪些?
0_1.什么是自动装配,如何进行自动装配,自动装配的优缺点是什么?
0_2.继承 Bean 配置如何配置?若父 Bean 想作为模板该如何配置?
0_3.什么是依赖 Bean 配置,如何进行依赖 Bean 配置?
0_4.Bean 的作用域有哪些?如何配置?如何使用?默认情况下作用域是什么?
0_5.如何使用配置文件实现数据库的连接?
1.Spring表达式语言说的是什么?使用什么作为界定符?作用是什么?
1.Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
2.语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL
3.SpEL 为 bean 的属性进行动态赋值提供了便利
2.通过 SpEL 可以实现哪些操作?
1.通过 bean 的 id 对 bean 进行引用
2.调用方法以及引用对象中的属性
3.计算表达式的值
4.正则表达式的匹配
3.SpEL:字面量中可以表示哪些类型的量?分别做回忆。
整数:<property name="count" value="#{5}"/>
小数:<property name="frequency" value="#{89.7}"/>
科学计数法:<property name="capacity" value="#{1e4}"/>
String字符串:<property name=“name” value="#{'Chuck'}"/> 或 <property name='name' value='#{"Chuck"}'/>
<bean id="address" class="com.atguigu.spring.beans.spel.Address">
<property name="city" value="#{'BeiJing'}"></property>
<property name="street" value="WuDaoKou"></property>
</bean>
测试代码:
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-spel.xml");
System.out.println((Address)ctx.getBean("address"));
Boolean:<property name="enabled" value="#{false}"/>
4.如何引用Bean、属性和方法?
1.引用其他对象:
<property name="prefix" value="#{prefixGenerator}"/>
2.引用其他对象的属性
<property name="suffix" value="#{sequenceGenerator2.suffix}"/>
3.调用其他方法,还可以链式操作
<property name="suffix" value="#{sequenceGenerator2.toString()}"/>
5.SpEL支持哪些运算符号?
1.算数运算符:+, -, *, /, %, ^:
2.加号还可以用作字符串连接
<property name="suffix" value="#{performer.firstName+' '+performer.lastName}"/>
3.比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge
<property name="suffix" value="#{counter.total==100}"/>
<property name="suffix" value="#{counter.total le 10000}"/>
4.逻辑运算符号: and, or, not, |
5.三目运算符
<constructor-arg value="#{songSelector.selectSong()=='J'?piano:'Ji'}"/>
<bean id="person" class="com.atguigu.spring.beans.spel.Person">
<property name="car" value="#{car}"></property>
<property name="city" value="#{address.city}"></property>
<property name="info" value="#{car.price>300000?'金额':'白领'}"></property>
<property name="name" value='Tom'></property>
</bean>
测试代码:
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-spel.xml");
System.out.println((Person)ctx.getBean("person"));
6.if-else 的变体
<constructor-arg value="#{kenny.song ?:'Greensleeves'}"/>
7.正则表达式:matches
<constructor-arg value="#{admin.email matches '[a-zA-Z0-9._%+-]'}"/>
8.调用静态方法或静态属性
<property name="initValue" value="#{T(java.lang.Math).PI}"/>
<bean id="car" class="com.atguigu.spring.beans.spel.Car">
<property name="brand" value="Audi"></property>
<property name="price" value="500000"></property>
<property name="tyrePerimeter" value="#{T(java.lang.Math).PI*80}"></property>
</bean>
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-spel.xml");
System.out.println((Car)ctx.getBean("car"));
6.什么可以对Bean的生命周期进行管理?
1.Spring IOC容器可以对Bean的生命周期进行管理。
7.Spring IOC 容器对 Bean 的生命周期进行管理的过程是什么样的?
1.通过构造器或工厂方法创建 Bean 实例
2.为 Bean 的属性设置值和对其他 Bean 的引用
3.调用 Bean 的初始化方法
4.Bean 可以使用了
5.当容器关闭时, 调用 Bean 的销毁方法
测试实例:
public class Car {
public Car() {
System.out.println("Car's Constructor...");
}
private String brand;
public void setBrand(String brand) {
System.out.println("setBrand...");
this.brand=brand;
}
public void init() {
System.out.println("init...");
}
public void destroy() {
System.out.println("destroy...");
}
}
bean配置文件:
<?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:util="http://www.springframework.org/schema/util"
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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="car" class="com.atguigu.spring.beans.cycle.Car"
init-method="init"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
</beans>
测试代码:
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");
System.out.println(ctx.getBean(Car.class).toString());
ctx.close();
}
测试结果:
Car's Constructor...
setBrand...
init...
com.atguigu.spring.beans.cycle.Car@c267ef4
4月 30, 2020 11:18:50 上午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@16b3fc9e: startup date [Thu Apr 30 11:18:49 CST 2020]; root of context hierarchy
destroy.
8.如何为 Bean 指定初始化和销毁方法?
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
9.如果想在创建bean前后做操作,可以做什么处理?其处理范围是什么?其典型应用是什么?如何配置?
1.Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
2.Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例.
3.其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
4.需要创建类实现接口Interface BeanPostProcessor,并且在配置文件中进行配置。
10.添加Bean后置处理器之后Bean的生命周期是什么样的?
1.通过构造器或工厂方法创建 Bean 实例
2.为 Bean 的属性设置值和对其他 Bean 的引用
3.将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
4.调用 Bean 的初始化方法
5.将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
6.Bean 可以使用了
7.当容器关闭时, 调用 Bean 的销毁方法
样例代码:
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization"+bean+","+beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization"+bean+","+beanName);
return bean;
}
}
bean配置:
<?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:util="http://www.springframework.org/schema/util"
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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="car" class="com.atguigu.spring.beans.cycle.Car"
init-method="init2"
destroy-method="destroy">
<property name="brand" value="Audi"></property>
</bean>
<bean class="com.atguigu.spring.beans.cycle.MyBeanPostProcessor"></bean>
</beans>
测试代码:
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("beans-cycle.xml");
System.out.println(ctx.getBean(Car.class).toString());
ctx.close();
}
测试结果:
Car's Constructor...
setBrand...
postProcessBeforeInitializationcom.atguigu.spring.beans.cycle.Car@17046283,car
init...
postProcessAfterInitializationcom.atguigu.spring.beans.cycle.Car@17046283,car
com.atguigu.spring.beans.cycle.Car@17046283
4月 30, 2020 11:42:16 上午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@16b3fc9e: startup date [Thu Apr 30 11:42:16 CST 2020]; root of context hierarchy
destroy...
11.bean的创建方式有哪几种?
1.工厂方式:
1).通过调用静态工厂方法创建 Bean
2).通过调用实例工厂方法创建 Bean
2.通过全类名方式,即在配置文件中配置class
3.FactoryBean
12.通过调用静态工厂方法创建 Bean的含义和特点是什么?如何通过静态工厂方法创建Bean
1.调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.
2.
1)创建工厂方法
2)要声明通过静态方法创建的 Bean.
Bean 的 class 属性里指定拥有该工厂的方法的类,
factory-method 属性里指定工厂方法的名称.
元素为该方法传递方法参数
3.代码示例
1)class类
public class Car {
private String brand;
private double price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", price=" + price + "]";
}
public Car(String brand, double price) {
super();
this.brand = brand;
this.price = price;
}
}
2)静态工厂
public class StaticCarFactory {
private static Map<String,Car> cars=new HashMap<String,Car>();
static {
cars.put("audi", new Car("audi",300000));
cars.put("ford",new Car("ford",40000));
}
public static Car getCar(String name) {
return cars.get(name);
}
}
3)申明配置
<?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:util="http://www.springframework.org/schema/util"
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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="car1" class="com.atguigu.spring.beans.factory.StaticCarFactory"
factory-method="getCar"><!--也可以配置init-method和destroy-method,还可以配置Bean后置处理器-->
<constructor-arg value="audi"></constructor-arg>
</bean>
</beans>
4)测试
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-factory.xml");
System.out.println((Car)ctx.getBean("car1"));
}
13.通过实例工厂方法创建Bean主要思想是什么?如何通过实例工厂方法创建Bean
1.实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 使用时需要简单的调用该实例方法而不需要关心对象的创建细节.
2.使用过程
1)创建实例工程
2)申明实例工程和配置bean
在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean
在 factory-method 属性里指定该工厂方法的名称
使用 construtor-arg 元素为工厂方法传递方法参数
3)使用测试
3.示例代码
1)创建实例工程
public class InstanceCarFactory {
private Map<String,Car> cars=null;
public InstanceCarFactory() {
cars=new HashMap<String,Car>();
cars.put("audi", new Car("audi",300000));
cars.put("ford",new Car("ford",40000));
}
public Car getCar(String brand){
return cars.get(brand);
}
}
2)申明实例工程和配置bean
<bean id="carFactory" class="com.atguigu.spring.beans.factory.InstanceCarFactory"></bean>
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="ford"></constructor-arg>
</bean>
3)测试代码
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-factory.xml");
System.out.println((Car)ctx.getBean("car2"));
}
14.什么是FactoryBean?FactoryBean中有哪几种方法,分别是什么?配置过程包括哪些?
1.Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象
2.
3.
1)实现接口FactoryBean
2)在bean文件中进行配置
实例代码
1)实现接口FactoryBean
public class CarFactoryBean implements FactoryBean<Car>{
private String brand;
public void setBrand(String brand) {
this.brand=brand;
}
@Override
public Car getObject() throws Exception {
// TODO Auto-generated method stub
return new Car(brand,50000);
}
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Car.class;
}
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
2)在bean文件中进行配置
<?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:util="http://www.springframework.org/schema/util"
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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<bean id="car" class="com.atguigu.spring.beans.factorybean.CarFactoryBean">
<property name="brand" value="BMW"></property>
</bean>
</beans>
3)测试代码
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-beanfactory.xml");
System.out.println((Car)ctx.getBean("car"));
}