第1章:spring注入/1.1 元数据配置/1.1.1 元数据概念
- 元数据概念
- 指的是为容器实例化Bean( 第0章:spring架构中几个概念/0.9 Bean概念)和为Bean注入其它Bean(也就是依赖注入)提供相关的信息
- 目的:容器利用这些相关的信息为Bean进行实例化、Bean查找、Bean注入、Bean生命周期管理等功能
第1章:spring注入/1.1 元数据配置/1.1.2 XML配置方式/1.1.2.2 XML文件结构/1.1.2.2.9 属性定义:属性值为其它Bean
- 属性定义:引用其它Bean
-
- 格式:
<property name="set方法名" ref="Bean名称"/>
- 说明:
-
- set方法名:
- 要求是set方法后面名称部分,而且首字母小写,比如setAccountDaoDao,则property中的name是 accountDaoDao
- 要求对应的类中要实现对应的set方法
- 不要求 name="set方法名" 中的方法名与类属性名一致,比如
- set方法名是:setAccountDaoDao
- 类属性名是:
private AccountDao accountDao;
- set和get方法由myeclipse自动生成的操作:
- 完成后自动生成的代码:
private Map<Long,Account> accountsMap = new HashMap<Long, Account>();
//本方法是自动生成的
public Map<Long, Account> getAccountsMap() {
return accountsMap;
}
//本方法是自动生成的
public void setAccountsMap(Map<Long, Account> accountsMap) {
this.accountsMap = accountsMap;
}
- 完成后自动生成的代码:
- Bean名称:
-
- 参考第一点说明的bean名称
- 要求该bean也在本文件中已经定义或者跨文件定义Bean,对于跨文件定义Bean,参考: 第2章:spring中的Bean/2.5 Bean中定义配置文件/2.5.1 使用环境参数连接不同的配置文件
-
- set方法名:
-
- 举例:
- bean属性定义
<bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">
<!-- bean中某个属性的定义:它的初始化值为另外的一个bean -->
<property name="accountDaoDao" ref="accountDao" />
</bean>
- 依赖bean的定义
<!-- 被依赖的bean的定义 -->
<bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">
- bean属性对应的类属性
//类属性
private AccountDao accountDao;
- bean属性对应的set方法
//类属性对应的set方法
public void setAccountDaoDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
- bean属性定义
- 格式:
第1章:spring注入/1.1 元数据配置/1.1.2 XML配置方式/1.1.2.2 XML文件结构/1.1.2.2.10 属性定义:属性值为Properties
- 属性定义:属性值为Properties
-
- 格式:
<property name="set方法名">
<props>
<prop key="字符串">基本类型</prop>
<prop key="字符串">基本类型</prop>
</props>
</property>
- 说明:
- set方法名:参照 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.4 属性定义:属性值为其它Bean 中方法名的说明
- 具体值:
- key要求都是字符串类型,不能是引用的bean
- 值就是基本类型,包括String/float/int等
- 举例:
- 属性声明:
private Properties properties; // Properties的使用
- 属性在XML中定义:
<!-- Properties属性定义: private Properties properties; //Properties的使用; -->
<property name="properties">
<props>
<prop key="name">翁永生</prop>
<prop key="age">33</prop>
</props>
</property>
- 属性声明:
- 格式:
第1章:spring注入/1.1 元数据配置/1.1.2 XML配置方式/1.1.2.4 实例完整源代码
- XML配置方式实例源代码(Maven工程,已编译通过)
第1章:spring注入/1.1 元数据配置/1.1.3 JAVA配置方式/1.1.3.2 配置类结构/1.1.3.2.2 方法注解:@Bean
- 方法注解:@Bean
- 引入注解
import org.springframework.context.annotation.Bean;
- 格式:在方法上面引入@Bean
- 方法格式:
- 默认无参数
- 返回值:建议接口(非强制),不建议类,目的是为了多态
- 实现逻辑:
- 创建对象
- 创建对象内的依赖,也就是为该对象里面的属性对象赋值
- 其它必要的业务逻辑
- 举例:
@Bean
public AccountService accountService() {
AccountServiceImpl bean = new AccountServiceImpl();
bean.setAccountDao(accountDao());
return bean;
}
@Bean
public AccountDao accountDao() {
AccountDao bean = new AccountDaoInMemoryImpl();
//depedencies of accountDao bean will be injected here...
return bean;
}
- 注意:
- 也可以定义非Bean方法,它通过正常的类对象方式调用,而不是spring容器
//本方法是非Bean方法
public void func(){
//其它业务逻辑,可通过正常的对象调用方法方式,而不是spring容器
System.out.println("在Bean类中非Bean方法的调用");
}
- Bean注解的方法都是单例模式,也就是无论调用多少次,永远只返回一个实例
- 也可以定义非Bean方法,它通过正常的类对象方式调用,而不是spring容器
第1章:spring注入/1.1 元数据配置/1.1.3 JAVA配置方式/1.1.3.3 配置类方式调用
- 配置类方式调用
- 引入相关类
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- 生成spring容器对象
- 格式:AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(配置类1.class,配置类2.class,。。。配置类3.class);,配置类可以有多个
- 举例:
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);
- 从spring容器中获取相关Bean引用:与XML配置方式一样
- 格式:接口引用或者类引用,与getBean方法的第二个参数相同 = 上一步的spring容器引用.getBean("bean名称", 接口名或者类名.class);
- bean名称:默认是@Bean注解的方法名,也可以是@Configuration注解的类名
- 举例:
//@Configuration注解的类名
Ch2BeanConfiguration ch2BeanConfiguration = applicationContext.getBean("ch2BeanConfiguration", Ch2BeanConfiguration.class);
//@注解的方法名
AccountService accountService = applicationContext.getBean("accountService", AccountService.class);
- 格式:接口引用或者类引用,与getBean方法的第二个参数相同 = 上一步的spring容器引用.getBean("bean名称", 接口名或者类名.class);
第1章:spring注入/1.1 元数据配置/1.1.3 JAVA配置方式/1.1.3.4 实例完整源代码
- Java配置方式实例源代码(Maven工程,已编译通过)
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.1 概念
- 概念
- 与 第1章:spring注入/1.1 元数据配置/1.3 JAVA配置方式/1.3.1 概念类似,但是不同的是,注解方式不需要一个专门的配置类,而是将注解随意写到需要配置成Bean的类上
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.2 注解/1.1.4.2.1 类注解:@Service
- 注解:@Service
- 所在的包
import org.springframework.stereotype.Service;
- 作用:将一个类定义为Bean
- 格式:在类上面声明@Service,bean的名称默认为第一个字母为小写的类名
- 举例:
@Service
public class AccountServiceImpl implements AccountService {
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.2 注解/1.1.4.2.2 类注解:@Repository
- 注解:@Repository
-
- 所在的包
import org.springframework.stereotype.Repository;
- 作用:类似于 第1章:spring注入/1.1 元数据配置/1.4 注解方式/1.4.2 注解:@Service,不同的是它还提供与数据相关联的其它功能,具体在第5章介绍
- 格式:在类上面声明@Repository
- 举例:
@Repository
public class AccountDaoInMemoryImpl implements AccountDao {
- 所在的包
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.2 注解/1.1.4.2.3 方法注解:@Autowired
- 注解:@Autowired(具体参照:1.5 autowire:自动装载)
-
- 所在的包:
import org.springframework.stereotype.Service;
- 作用:查找spring容器中的Bean类型,然后匹配@Autowired注解的方法参数类型,如果能找到并且是唯一则进行注入,这里的匹配指的是几种情况:
- Bean类型为参数类型的实现类
- Bean类型为参数类型的子类
- Bean类型为参数类型为同一个类
- 格式:在方法上面声明@Autowired
- 举例:
-
-
@Autowired
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
- 例子中的类型是:AccountDao accountDao,则spring容器则查到与 AccountDao 匹配的实现类(因为AccountDao 是一个接口),刚好找到 第1章:spring注入/1.1 元数据配置/1.4 注解方式/1.4.3 注解:@Repository中的AccountDaoInMemoryImpl类为实现类,同时又不是Bean,比如把AccountDaoInMemoryImpl 类去掉Bean标识则编译时会报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.wiley.beginningspring.ch2.AccountServiceImpl.setAccountDao(com.wiley.beginningspring.ch2.AccountDao); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.wiley.beginningspring.ch2.AccountDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 13 more
-
-
- 注意:
- 与方法的命名没有关系,不过约定默认是set开头的方法名
- 所在的包:
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.3 注解调用方式/1.1.4.3.1 配置XML确定注解扫描范围
- 配置XML确定注解扫描范围
- XML的结构参照:
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.1 XML头部
- 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.2 外部Beans(复数,表示里面可定义多个Bean)
- 确定包范围:
- 格式:<context:component-scan base-package="要扫描的包路径"/>
- 举例:
<context:component-scan base-package="com.wiley.beginningspring.ch2"/>
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.3 注解调用方式/1.1.4.3.2 调用方式
- 调用方式
-
- 引入相关类
import org.springframework.context.support.ClassPathXmlApplicationContext;
- 生成spring容器对象:与 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.3 XML配置方式调用 一样
- 从spring容器中获取相关Bean引用:与 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.3 XML配置方式调用 一样
- 引入相关类
第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.4 实例完整源代码
- 注解方式实例源代码(Maven工程,已编译通过)