IOC容器的基本用法三

  1. 采用注解的方式进行获取
<!--给Dao、Service、Servlet注册,采用注解的方式,Spring遇到这类注解标注的类都会自动加入到容器中
        这些注解都是特殊含义的
        @Service:建议给sevice类添加
        @Controller:建议给servlet类添加
        @Respository:Dao类添加
        @Component:其他想要加入到容器中的组件
    注:Spring地层并不会去区分这些注解的含义,统一认为是加入容器的标志,这只是给程序员自己看的
    这些注解默认的组件的id是类名首字母小写
    可以修改,注解(value="新id");
    同样的,注解修饰的组件也是IOC容器启动时,创建的,默认也是单例的
    可以修改作用域
    两个注解配合使用,
    @特定注解
    @scope(value="作用域")

    要实现这个功能,需要用到context命名空间,来让Spring知道,这些注解修饰的类要加入到容器中  
      -->
      <!--component-scan来扫描组件
          base-package:基础包,Spring会扫描这个包及这个包下的所后代自包
        -->
      <context:component-scan base-package="com.fgy"></context:component-scan>
2. 使用context:exclude-filter指定扫描包时不包含的类
   <!--默认是扫描包下的所类  -->
      <context:component-scan base-package="com.fgy">
      <!--
            type="annotation":排除模式
                annotation:排除指定的注解,
                expression="":要排除的注解的全类名
                "assignable":排除指定的类,及该类下的所子类
                expression=""要排除类的全类名
        -->   
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
            <context:exclude-filter type="assignable" expression="com.fgy.dao.BookDao"/>

      </context:component-scan>
3. 使用context:include-filter指定扫描包时要包含的类
  <!--默认是扫描包下的所类  -->
      <context:component-scan base-package="com.fgy" use-default-filters="false">
      <!--
            必须的设置 use-default-filters="false"
            type="annotation":指定扫描模式
                annotation:扫描指定的注解,
                expression="":要扫描的注解的全类名
                "assignable":扫描指定的类,及该类下的所子类
                expression=""要扫描类的全类名
        -->   
      <!--  -->
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
      </context:component-scan>
4. 使用@Autowired注解实现根据类型实现自动装配
<!--@Autowired自动装配属性对象值,get、set方法都不用写
        1.属性上标注@Autowired,IOC容器创建对象的时候,会为这个属性自动赋值
        2.赋值流程:
            1)先照类型赋值
            2)如果组件的类型多个,则照其属性名作为组件的id进行赋值
            3)如果照变量名都找不到,@Qualifier("id")指定id,来查找装配的组件
            4)@Qualifier都找不到,就报错,但是现在不让它报错
                默认的情况下,@Autowired标注的属性,一定要装配上,否则就报错
                要实现装不上不报错的方法:
                    在@Autowired(required=false),表示这个属性的装配不是必须的,装不上就算了,不报错

        3.给set方法标注的@Autowired和给property标签复赋值一样,自动赋值
        4.@Resource和@Autowired那个好:前者是Java定义的规范,后者是自己的东西,我们用哪个呢?我们应该是表规范好一点,别人也能用
            这个规范,假设第二个IOC容器,这个容器框架不认识Spring的@Autowired注解,但是认识Java规范,兼容性好。但是,不幸的是IOC容器和AOP
            合起来的这个框架,市场上仅一家,所以不用担心兼容性问题
    -->

5. 泛型依赖注入

以简单书城项目为类:
在dao包内有三个类,BaseDao,UserDao,BookDao;
public class BaseDao <T>{
    public void save() {
        System.out.println("BaseDao:将数据保存到数据库中......");
    }
}
@Repository
public class BookDao extends BaseDao<Book> {
    public void save() {
        System.out.println("保存图书到数据库中......");
    }
}
@Repository
public class UserDao extends BaseDao<User> {
    @Override
    public void save() {
        System.out.println("保存用户到数据库中......");
    }
}
在service包中也有三个类
BaseService,BookService,UserService
public class BaseService<T> {   
    @Autowired
    protected BaseDao<T> baseDao;
}

@Service
public class UserService extends BaseService<User>{
    public void save() {
        baseDao.save();
    }   
}

@Service
public class BookService extends BaseService<Book>{
    public void save() {
        baseDao.save();
    }
}

测试类
public class IOCTest {

    ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
    @Test
    public void test() {
        BookService bookService= ioc.getBean(BookService.class);
        UserService userService = ioc.getBean(UserService.class);
        bookService.save();
        userService.save();
    }

}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值