1.javaBean规范是什么?
满足如下规范的类的实例就是javabean对象,
a.有包并且包中包含类
b.属性都是私有的
c.有无参构造方法
d.有get、set方法
e.实现序列化接口
2.什么是Spring?
是一个开源的用来简化企业级应用开发的框架
3.Spring的特点有哪些?
a.简化开发
Spring框架对一些常见的API做了封装,可以减少代码量
b.管理对象
Spring可以帮我们管理对象之间的依赖关系,使软件更容易维护
c.集成其他框架
Spring可以集成其他框架,比如Mybatis
4.Spring容器是什么以及如何启动Spring容器?
Spring容器是Spring框架中的一个核心模块,用来管理对象的。
如何启动Spring容器?
a.导包Spring-webmvc
b.添加配置文件Spring配置文件
c.启动容器
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext是一个接口,ClassPathXmlApplicationContext是该接口的一个实现类;
如何创建对象?
a.无参构造器方法
Student stu=ac.getBean("stu",Student.class);
配置文件中代码:
<bean id="stu" class="first.Student"></bean>
b.静态工厂方法
c.实例工厂方法
实例对象的作用域:
默认情况下,作用域为单例singleton,只会创建单个实例,当作用域为原型prototype时会创建多个实例,通过scope属性来设h置作用域
配置文件中代码如下
<bean id="stu" class="first.Student" scope="prototype"></bean>
实例对象生命周期相关的两个方法:
init-method:指定初始化方法
destroy-method:指定销毁方法,只有作用域为单例的bean销毁方法才有效
配置文件中代码如下:
<bean id="stu" class="first.Student" init-method="init" destroy-method="destroy"></bean>
实体类中代码如下:
public class Student{
public void init(){
System.out.println("初始化方法");
}
public void study(){
System.out.println("学习");
}
public void destroy(){
System.out.println("销毁方法");
}
}
延迟加载:
默认情况下,容器启动之后会将作用域为单例的bean创建好;而延迟加载后,容器启动之后不会创建bean,只有通过getBean方法后才会创建bean。(可以提高效率)
通过lazy-init属性设置是否延迟加载,为true时表示延迟加载
配置文件中代码:
<bean id="stu" class="first.Student" lazy-init="true"></bean>
5.什么是IOC和DI?
IOC:控制反转,对象之间的依赖关系交给容器来管理(目标)
DI:依赖注入,容器通过依赖注入的方式来建立对象之间的依赖关系(手段)
DI有set注入或者构造器注入
set注入:
step1.在相应的实体类中提供set方法
step2.在配置文件中通过property元素来配置要注入的对象name:指定属性名
ref:指定要注入的属性值,即要注入的bean对象的id
配置文件中的代码如下:
<bean id="a" class="ioc.A"></bean>
<bean id="b" class="ioc.B">
/*在b类中要有属性A1的set方法,将id=a的bean通过set方法的参数传入*/
<property name="a1" ref="a">
</bean>
b类中的代码如下:
public class B{
private A a1;
public B(){
}
public void setA1(A a1){
this.a1=a1;
}
public void service(){
//调用a1的f方法
a1.f();
}
}
构造器注入:
constructor-arg元素表示构造器注入
index,表示构造器的参数下表,从0开始,
ref表示要注入的bean的id值
配置文件中代码如下:
<bean id="a" class="ioc.A"></bean>
<bean id="b" class="ioc.B">
<constructor-arg index="0" ref="a"/>
</bean>
实体类的代码就是有构造器既可,此处省略
自动装配:
默认情况下容器不会自动装配,可以通过outowire属性让容器依据某些规则来注入相应对象。outowire的属性值有3个
byName
byType
constructor
注入基本类型
注入集合类型
以引用的方式注入集合类型
6.使用注解简化配置
如果类的前面加了特定的注解(比如@Component),那么容器就会将这个类纳入容器进行管理(相当于配置了一个bean,其中bean的id默认就是首字母小写之后的类名,也可以在注解后面的括号中自己定义bean的id)
组件扫面:容器会扫描指定包及其子包下面的所有类
@Component("be1")//指定bean的id为be1
@Scope("singleton")//指定作用域为单例
@Lazy(true) //指定延迟加载
public class Test{}
方法上面也可以加注解
@PostConstruct//指定初始化方法
public void init(){}
@PreDestroy//指定销毁方法
public void destroy(){}
配置文件中通过component-scan来配置组件扫描:
<context:component-scan base-package="annotation"/>//指定要扫描的包
依赖注入相关2组注解:
支持set方式注入和构造器方式注入
@Autowired和Qualifier
set方式注入,实体类中代码如下:
@Autowired
public void setWt(@Qualifier("wt") Waiter wt){
System.out.println();
this.wt=wt;
}
或者
@Autowired
@Qualifier("wt")
private Waiter wt;
构造器方式注入,配置文件中代码如下:
@Autowired
public Manager(@Qualifier("wt") waitere wt){
this.wt=wt;
}