7.泛型的依赖注入

示例:
1.bean层:
    1.1
        public class Book {}-------->模拟的两个实体类中没有具体属性
    1.2
       public class User {} 
2.service层
    2.1Book的service类:
        @Service---------------->加入了service标签
        public class BookService extends BaseService<Book>{
        }   
    2.2User的service类:
        @Service---------------->加入了service标签
        public class UserService extends BaseService<User>{-------------->两个均没有自己的独有方法,因为集成了BaseService类
        }
    2.3BaseService
        public class BaseService<T> {---------->注意1:该类没有注解   注意2:该类有泛型
            @Autowired----------------------->自动注入的注解
            private BaseDao<T> baseDao;
            public void service(){
                baseDao.save();
            }
        }
3.dao层
    3.1抽象出基本的dao层方法
        public abstract class BaseDao<T> {--------->注意1:该类没有注解   注意2:该类有泛型
            public abstract void save();----------->定义了抽象方法:供其他类重写
        }
    3.2book的dao层方法
        @Repository----------------------------->加入标签,将组件加载到容器中
        public class BookDao extends BaseDao<Book>{----------->加入book的泛型
            public void save() {------------------------------>重写父类方法
                System.out.println("book的保存方法!");
            }
        }
    3.3user的dao层方法
        @Repository----------------------------->加入标签,将组件加载到容器中
        public class UserDao extends BaseDao<User>{----------->加入user的泛型
            public void save() {------------------------------>重写父类方法
                System.out.println("用户的保存方法!");
            }
        }
        
3.测试代码:使用的是springtest的测试
    @ContextConfiguration(locations = "classpath:ioc.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    public class Test {
        @Autowired
        BookService bookService;
        @Autowired
        UserService userService;
        @org.junit.Test
        public void test(){
            bookService.service();--->输出:book的保存方法!
            userService.service();--->输出:用户的保存方法!
        }
    }


结论:
1.service层的继承研究
    父类service:
        public class BaseService<T> {----->类上并没有注解,即这个父类不会被加载到容器中
            @Autowired--------------->但是带有@Autowired标签,按照之前的结论:当一个类有@Autowired自动注入时,这个类必须是容器中的组件:
                                ----->不然:1.无法从容器中获取该组件 2.无法自动注入                                                        
            private BaseDao<T> baseDao;
            public void service(){
                System.out.println("自动注入dao:"+baseDao+" 当前对象:"+this);
                baseDao.save();
            }
        }
    子类service:
        @Service------------>有标签,所以子类在容器中,并且继承BaseService类,继承父类的所有属性和方法(虽然父类的属性是私有属性,按照常规无法继承,
                ------------>实质是可以继承,只是无法使用)
        public class BookService extends BaseService<Book>{
        }
    则真实子类为:
        @Service
        public class BookService extends BaseService<Book>{
            @Autowired
            private BaseDao<T> baseDao;
            public void service(){
                System.out.println("自动注入dao:"+baseDao+" 当前对象:"+this);
                baseDao.save();
            }
        }
        这时:@Autowired标签的类在组件中,可以自动装配

posted @ 2022-05-06 21:40  努力的达子  阅读(159)  评论(0编辑  收藏  举报