IOC容器的基本用法三

来源:互联网 发布:centos 开启ftp 编辑:程序博客网 时间:2024/05/21 17:36
  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:将数据保存到数据库中......");    }}@Repositorypublic class BookDao extends BaseDao<Book> {    public void save() {        System.out.println("保存图书到数据库中......");    }}@Repositorypublic class UserDao extends BaseDao<User> {    @Override    public void save() {        System.out.println("保存用户到数据库中......");    }}在service包中也有三个类BaseService,BookService,UserServicepublic class BaseService<T> {       @Autowired    protected BaseDao<T> baseDao;}@Servicepublic class UserService extends BaseService<User>{    public void save() {        baseDao.save();    }   }@Servicepublic 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();    }}

这里写图片描述

原创粉丝点击