-
xml方式的Bean自动注入(<beans>标签的属性default-autowire=byName)
No:不做任何操作,默认选项。
byname:根据setXXX()方法的set后的名称进行自动注入(首字母不区分大小写)。查找xml中有没有<bean>标签id的名称与属性完全一致的,如果有则自动注入,并且执行set方法,基于set方法,如果没有不报错,该属性置为NULL,并且不执行set()。
byType:根据类型自动注入,如果容器中存在一个与指定属性类型相同的bean,那么该属性自动注入;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配,如果没有找到相匹配的bean,则什么事都不发生,该属性置为null基于set方法。
Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一个bean,那么抛出异常。
Spring官方文档对自动注入属性的四种类型解释
案例:(原理:IOC容器加载XML配置文件,由于设置了自动按名称进行注入,所以当获取Bean1的实例时,查找XML文件中有没有Id为set方法后的名称(去掉set,并且不区分大小写),如果有则进行自动注入)
步骤1:
编写两个类,并在其中一个类中引用其他类作为自己的属性,而且必须提供set方法。
步骤2:
编写xml文件
<beans>标签添加 default-autowire="byName"
并且对着两个类进行<bean>配置。
代码:
public class Bean1{
private Bean2 bean2;
public Bean2 getBean3() {
return bean2;
}
public void setBean3(Bean2 bean2) {
this.bean2 = bean2;
}
}
xml:<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.xsd"
default-autowire="byName">
<bean id="bean1" class="main.java.com.imooc.Bean1"></bean>
<bean id="bean3" class="main.java.com.imooc.Bean2"></bean>
</beans>
结果:
Bean1 [bean2=main.java.com.imooc.Bean2@2ec5f45d]
当default-autowire="byType"时:则会根据属性的类型查找xml中是否有和它相同的类型的<bean>(也就是class),如果有以一个则进行注入,如果一个以上则报异常,没有则为null。
通过构造方法实现自动注入:
步骤1:提供构造方法为属性赋值。
代码:
public class Bean1{
private Bean2 bean2;
public Bean1(Bean2 bean2) {
super();
this.bean2 = bean2;
}
步骤2:xml中设置default-autowired="constructor”,并且提供和有参构造函数的参数相同类型的一个<bean>标签。
代码:
<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.xsd"
default-autowire="constructor">
<bean id="bean1" class="main.java.com.imooc.Bean1"></bean>
<bean class="main.java.com.imooc.Bean2"></bean>
</beans>
结果:
Bean2@5c5766b1
查看全部 -
Aware接口
定义:Spring中提供了一些以Aware结尾的接口,实现了Aware接口的Bean在被初始化后,可以获取相应资源,通过Aware接口,可以对Spring相应资源进行操作(慎重),前提配置<bean>标签,并使用ioc容器去记性加载。
ApplicationContextAware:Bean类实现该接口,通过该接口提供的方法,可以直接获取spring上下文,而不用我们自己手动创建。
BeanNameAware:Bean类实现该接口,通过该接口提供的方法,可以直接获取<bean>标签的Id。
ApplicationEventPublisherAware:提供事件的发布。
BeanClassLoaderAware:找到相关的类加载器。
案例:通过传入的Bean的ID和传入的ApplicationContext对象,来获取Bean的对象(原理:IOC容器加载配置文件,通过<bean>标签,去实例化Bean,由于实现了XXXAware接口,通过setXXX方法,去获取相应的资源)
public class MoocApplicationContext implements ApplicationContextAware,BeanNameAware {
private String name;(通过这种方式就可以在其他方法中进行使用该对象,例如判断某个对象是否存在)
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
System.out.println("setApplicationContext的ApplicationContext:"+ac.hashCode());
System.out.println(ac.getBean(this.name,MoocApplicationContext.class));
}
@Override
public void setBeanName(String name) {
this.name=name;
System.out.println("setBeanNamename的方法"+name);
}
}
xml:
<bean id="moocApplicationContext" class="MoocApplicationContext" ></bean>
测试:
@Test
public void testMooc(){
ApplicationContext ac=new ClassPathXmlApplicationContext("spring-ioc.xml");
System.out.println("test的ApplicationContext:"+ac.hashCode());
}
结果:
setBeanNamename的方法moocApplicationContext
setApplicationContext的ApplicationContext:1516607441
MoocApplicationContext@4c7335b1
test的ApplicationContext:1516607441
查看全部 -
接口是用于隐藏具体实现和实现多态性的组件
IOC控制反转,就是控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器(spring)负责创建和维护
查看全部 -
Bean容器初始化
查看全部 -
单元测试截图
查看全部 -
IOC房屋中介
查看全部 -
控制反转,依赖注入
查看全部 -
spring中所有的对象都是bean
查看全部 -
@Autowired由Spring BeanPostProcessor处理,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor中应用@Autowired注解,否则会产生循环依赖
查看全部 -
<context:annotation-config>只会识别类中关于方法的注解
查看全部 -
AOP in Spring
查看全部 -
relevant concepts in AOP
查看全部 -
AOP implement types
查看全部 -
The definition of IoC
查看全部 -
如何定义好的切入点
查看全部
举报