1. 编写流程(基于xml)
1.导入jar包: 4+1
-beans/core/context/expression | commons-logging
2.编写目标类:dao和service
3.spring配置文件
-IoC: <bean id="" class="">
-DI: <bean> <property name="" value="" | ref="">
-实例化方式:
默认构造
静态工厂: <bean id="" class="工厂类" factory-method="静态方法">
实例工厂: <bean id="工厂名" class="工厂类"> <bean id="" factory-bean="工厂名" factory-method="方法">
-作用域: <bean id="" class="" scope="singleton|prototype">
-生命周期: <bean id="" class="" init-method="" destroy-method="">
后处理bean BeanPostProcesser接口, <bean class="注册">, 对容器中所有的bean都生效。
-属性注入:
构造方法注入: <bean> <constructor-arg index="" type="">
setter方法注入: <bean> <property>
p命名空间: 简化property <bean p:属性名="普通值" p:属性名-ref="引用值"> 注意声明命名空间。
SpEL: <property name="" value="#{表达式}">
#{123} #{'abc'} #{beanId.propName?.methodName()} #{T(类).静态方法|字段}
集合注入:
<array> <list> <set> <map><entry key="" value=""> <props><prop key="">...
4.核心api
BeanFactory,延迟实例化bean,第一次调用getBean
ApplicationContext 一般常用,功能更强。
ClassPathXmlApplicationContext 加载classpath.xml文件
FileSystemXmlApplicationContext 加载指定盘符文件,ServletContext.getRealPath()
2. 后处理bean对一个生效
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("userServiceId".equals(beanName)) {
System.out.println("前方法:" + beanName);
}
return bean;
}
3. 注解
1.扫描含有注解的类
<context:component-scan base-package="">
2.常见的注解
@Component 组件,任意bean
WEB
@Controller -web层
@Service -service层
@Repository -dao层
注入 -字段或setter方法
普通值: @Value
引用值:
类型: @Autowired
名称1: @Autowired @Qualifier("名称")
名称2: @Resource("名称")
作用域: @Scope("prototype")
生命周期:
初始化方法: @PostConstruct
销毁方法: @PostDestroy
4. 注解和xml混合使用
1.将所有的bean都配置到xml中
<bean id="" class="">
2.将所有的依赖都使用注解
@Autowired
默认不生效。为了使其生效,需要在xml中配置: <context:annotation-config>
总结:
注解1: <context:component-scan base-package="">
注解2: <context:annotation-config>
1.一般情况两个注解不一起使用。
2.“注解1”扫描含有注解(@Component等)类,注入注解自动生效。
“注解2”只在xml和注解(注入)混合使用时,使注入的注解生效的。