Spring系列:
1.XML配置方式
1.1.实例化Bean的四种方式
1.2.Bean的作用域
1.3.Bean的生命周期
1.4.Bean属性的依赖注入
2.注解配置方式
2.1.Bean的定义(注册)-- 扫描机制
2.2.Bean属性的依赖注入
2.3.Bean的初始化和销毁
2.4. Bean的作用域
3.XML与注解方式混合使用
注:有参构造不可以实例化bean
演示:
【注意】单例是默认值,如果需要单例对象,则不需要配置scope。
通过spring工厂,可以控制bean的生命周期。
通过 init-method属性 指定初始化后的调用方法
通过 destroy-method属性 指定销毁对象前的方法
演示:
后处理Bean也称之为Bean的后处理器,作用是:在Bean初始化的前后,对Bean对象进行增强。
它既可以增强一个指定的Bean,也可以增强所有的Bean,底层很多功能(如AOP等)的实现都是基于它的,Spring可以在容器中直接识别调用。
什么是Bean属性的注入?就是对一个对象的属性赋值。有三种方式:
Spring 框架规范中通过配置文件配置的方式,只支持构造器参数注入和setter方法属性注入,不支持接口注入 !
使用的默认的构造器(无参构造),但必须提供属性的setter方法,使用setter方法也是企业经常使用的属性注入方式。
两步:在类中加入setter方法,在配置文件中使用property
第一步:创建CustomerService.java类
@Component(value="customerService")
public class CustomerService {
//保存业务方法
public void save(){
System.out.println("CustomerService业务层被调用了。。。");
}
}
1)@Component注解放置到类上
相当于spring容器中定义:
2)@Component(value="customerService") ,也可以自定义bean的id名字
如果不写value值,默认value值为类名的首字母小写,即customerService
相当于spring容器中定义:
3)只有value一个属性时,可以写作@Component("customerService"),也可以写作@Component
第二步: 配置applicationContext.xml,配置注解开启和注解Bean的扫描。
注意:配置注解bean扫描时,会自动开启注解功能,所以如果配置注解扫描可以不配置开启注解功能
第三步: 测试
public class SpringTest {
@Test
public void test(){
//spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
CustomerService customerService=(CustomerService) applicationContext.getBean("customerService");
customerService.save();
}
}
扩展优化:
1.注解扫描配置
配置注解扫描时,会自动开启注解功能,所以如果配置注解扫描可以不配置开启注解功能
2.衍生注解的问题
实际开发中,使用的是@Component三个衍生注解(“子注解”),子注解的作用:有分层的意义(分层注解)。
Spring3.0为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。除了@Component外,Spring提供了3个功能基本和@Component等效的注解
功能介绍:
@Service用于标注业务层组件(如Service层)
@Controller用于标注控制层组件(如struts中的action层)
@Repository用于标注数据访问组件,(如DAO层组件)。
而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。(比如测试类)
Spring3.0后,提供 @Value注解,可以完成简单数据的注入
将Dao类的对象注入到Service类进行使用。
注解实现属性依赖注入,将注解加在setXxx方法上 或者 属性定义上 !
1)使用@Value结合SpEL (spring3.0 后用)
2)使用@Autowired 结合 @Qualifier,或者单独使用@Autowired
推荐使用这一种,这一种开发中用到最多!
1:单独使用@Autowired:表示按照类型注入,会到spring容器中查找CustomerDao的类型,对应
2:结合使用@Autowired + @Qualifier:表示按照名称注入,会到spring容器中查找customerDao的名称,对应
3)JSR-250标准(基于jdk) 提供注解 @Resource
1:单独使用@Resource注解,表示先按照名称注入,会到spring容器中查找customerDao的名称,对应
如果没有找到,则会按照类型注入,会到spring容器中查找CustomerDao的类型,对应
:2:如果@Resource注解上添加name名称,使用@Resource注解,则按照名称注入,会到spring容器中查找customerDao的名称,对应
4)JSR-330标准(jdk) 提供 @Inject (有点麻烦),需要先导入 javax.inject 的依赖包
演示:
演示: