FactoryBean
FactoryBean是一个接口,需要创建一个类实现该接口
package com.mao.pojo;
import org.springframework.beans.factory.FactoryBean;
public class StudentFactoryBean implements FactoryBean {
//getObject方法将对象交给Spring容器来管理
@Override
public Object getObject() throws Exception {
return new Student();
}
//设置所提供的的对象的类型
@Override
public Class<?> getObjectType() {
return Student.class;
}
//设置是否单例
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
将该类交给spring容器来管理
<bean id="studentFactory" class="com.mao.pojo.StudentFactoryBean"/>
测试:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Student studentFactory = (Student) applicationContext.getBean("studentFactory");
System.out.println(studentFactory);
基于XML的自动装配
自动装配:根据指定的策略在IOC容器中匹配一个bean,自动为指定的bean中所依赖的类类型或接口类型赋值
基于XML的自动装配是在spring核心配置文件中,通过配置bean中的autowire属性来指定自动装配的策略
<bean id="userController" class="com.mao.controller.UserController" autowire="byType"></bean>
autowire有四种装配策略:
no,default表示不装配,即bean中的属性不会自动匹配某个bean为属性赋值
byType:根据属性的类型进行赋值
a>若通过类型没有找到任何一个类型匹配的bean,此时不装配,使用默认值
b>若通过类型找到了多个类型匹配的bean,此时会抛出异常
总结:使用byType实现自动装配时,IOC容器有且只有一个类型匹配的bean能够为属性赋值。
byName:根据要赋值的属性的属性名,例如:< property name=“UserService”>来进行赋值
当类型匹配的bean有多个时,可以使用byName来实现自动装配
基于注解来管理bean
@Component:将类标识为普通组件,即将类加载为bean交给springioc来管理
@Controller:将类标识为控制层组件
@Service:将类标识为业务层组件
@Repository:将类标识为持久层组件
在Spring中开启注解扫描
在spring核心配置文件中添加:
<!--扫描组件-->
<context:component-scan base-package="com.mao.exercise">
</context:component-scan>
context:exclude-filter:排除扫描
<!--扫描组件-->
<context:component-scan base-package="要扫描的包">
<!--根据注解来排除,expression表示注解的全限定名-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!--根据类型来排除,expression表示类型的全限定名-->
<context:exclude-filter type="assignable" expression="com.mao.exercise.controller.UserController"/>
</context:component-scan>
context:include-filter:包含扫描
<!--扫描组件-->
<context:component-scan base-package="com.mao.exercise" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
需要配置use-default-filters:false,使默认扫描指定包包含全部的功能失效,否则包含扫描就不起作用。
注意:通过注解+扫描配置的bean的id,默认值为类的小驼峰即UserController的bean的id为userController
自定义id:
@Autowired
通过@Autowired注解可以实现自动装配功能
@Autowired原理
a>默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值
b>若IOC容器中有多个相同类型的bean,此时会自动转换成byName的方式来为属性赋值,即将要赋值的属性名作为bean的id来匹配某个bean
c>如果byType和byName都无法实现自动装配,且IOC容器中有多个类型匹配的bean,且这些bean的id和要赋值的属性的属性名都不一致。
d>可以通过@Qualifier的value值来指定某个bean的id来为属性赋值
注意:若IOC容器中没有任何一个类型匹配的bean,在@Autowired中有个属性(require=true),该属性要求必须完成自动装配,否则就报错,可以将require=false,来避免出现该情况