易学笔记--第1章:spring注入/1.1 元数据配置

第1章:spring注入/1.1 元数据配置/1.1.1 元数据概念

  • 元数据概念

 

  1. 指的是为容器实例化Bean( 第0章:spring架构中几个概念/0.9 Bean概念)和为Bean注入其它Bean(也就是依赖注入)提供相关的信息
  2. 目的:容器利用这些相关的信息为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方法名:
          1. 要求是set方法后面名称部分,而且首字母小写,比如setAccountDaoDao,则property中的name是 accountDaoDao
          2. 要求对应的类中要实现对应的set方法
          3. 不要求 name="set方法名" 中的方法名与类属性名一致,比如
            1. set方法名是:setAccountDaoDao
            2. 类属性名是:

              private AccountDao accountDao;

          4. set和get方法由myeclipse自动生成的操作:
            1. 完成后自动生成的代码:

              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 使用环境参数连接不同的配置文件
    • 举例:
      1. bean属性定义

        <bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl">

                   <!-- bean中某个属性的定义:它的初始化值为另外的一个bean -->

                   <property name="accountDaoDao" ref="accountDao" />

             </bean>

      2. 依赖bean的定义

        <!-- 被依赖的bean的定义 -->

             <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl">

      3. bean属性对应的类属性

        //类属性

             private AccountDao accountDao;

      4. bean属性对应的set方法

        //类属性对应的set方法

             public void setAccountDaoDao(AccountDao accountDao) {

                   this.accountDao = accountDao;

             }


第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>

    • 说明:
      1. set方法名:参照  第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.4 属性定义:属性值为其它Bean 中方法名的说明
    • 具体值:
      1. key要求都是字符串类型,不能是引用的bean
      2. 值就是基本类型,包括String/float/int等
    • 举例:
      1. 属性声明:

        private Properties properties; // Properties的使用

      2. 属性在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
  1. 引入注解

    import org.springframework.context.annotation.Bean;

  2. 格式:在方法上面引入@Bean
  3. 方法格式:
    1. 默认无参数
    2. 返回值:建议接口(非强制),不建议类,目的是为了多态
    3. 实现逻辑:
      1. 创建对象
      2. 创建对象内的依赖,也就是为该对象里面的属性对象赋值
      3. 其它必要的业务逻辑
  4. 举例:

         @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;

         }

  5. 注意:
    1. 也可以定义非Bean方法,它通过正常的类对象方式调用,而不是spring容器

      //本方法是非Bean方法

           public void func(){

              //其它业务逻辑,可通过正常的对象调用方法方式,而不是spring容器

                 System.out.println("在Bean类中非Bean方法的调用");

           }

    2. Bean注解的方法都是单例模式,也就是无论调用多少次,永远只返回一个实例

第1章:spring注入/1.1 元数据配置/1.1.3 JAVA配置方式/1.1.3.3 配置类方式调用

  • 配置类方式调用
  1. 引入相关类

    import org.springframework.context.annotation.AnnotationConfigApplicationContext;

  2. 生成spring容器对象
    1. 格式:AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(配置类1.class,配置类2.class,。。。配置类3.class);,配置类可以有多个
    2. 举例:

      AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Ch2BeanConfiguration.class);

  3. 从spring容器中获取相关Bean引用:与XML配置方式一样
    1. 格式:接口引用或者类引用,与getBean方法的第二个参数相同 = 上一步的spring容器引用.getBean("bean名称", 接口名或者类名.class);
      1. bean名称:默认是@Bean注解的方法名,也可以是@Configuration注解的类名
    2. 举例:

      //@Configuration注解的类名

                 Ch2BeanConfiguration ch2BeanConfiguration = applicationContext.getBean("ch2BeanConfiguration", Ch2BeanConfiguration.class);

                 //@注解的方法名

                 AccountService accountService = applicationContext.getBean("accountService", AccountService.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. 与 第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
  1. 所在的包

    import org.springframework.stereotype.Service;

  2. 作用:将一个类定义为Bean
  3. 格式:在类上面声明@Service,bean的名称默认为第一个字母为小写的类名
  4. 举例:

    @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注解的方法参数类型,如果能找到并且是唯一则进行注入,这里的匹配指的是几种情况:
      1. Bean类型为参数类型的实现类
      2. Bean类型为参数类型的子类
      3. 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

    • 注意:
      1. 与方法的命名没有关系,不过约定默认是set开头的方法名

第1章:spring注入/1.1 元数据配置/1.1.4 注解方式/1.1.4.3 注解调用方式/1.1.4.3.1 配置XML确定注解扫描范围

  • 配置XML确定注解扫描范围

 

  1. XML的结构参照:
    1. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.1 XML头部
    2. 第1章:spring注入/1.1 元数据配置/1.2 XML配置方式/1.2.2 XML文件结构/1.2.2.2 外部Beans(复数,表示里面可定义多个Bean)
  2. 确定包范围:
    1. 格式:<context:component-scan base-package="要扫描的包路径"/>
    2. 举例:

      <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工程,已编译通过)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易学笔记(qq:1776565180)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值