Book.java:
package com.atguigu.bean; /** * @Title: Book * @Description: * @Author: * @Version: 1.0 * @create 2020/6/7 17:05 */ public class Book { }
User.java:
package com.atguigu.bean; /** * @Title: User * @Description: * @Author: * @Version: 1.0 * @create 2020/6/7 17:05 */ public class User { }
BaseDao.java:
package com.atguigu.dao; import org.springframework.stereotype.Repository; /** * 定义了基本的增删改查方法 */ public abstract class BaseDao<T> { public abstract void save(); }
BookDao.java:
package com.atguigu.dao; import com.atguigu.bean.Book; import org.springframework.stereotype.Repository; /** * @Title: BookDao * @Description: * @Author: * @Version: 1.0 * @create 2020/6/7 17:04 */ @Repository public class BookDao extends BaseDao<Book> { @Override public void save() { System.out.println("BaseDao...保存图书..."); } }
UserDao.java:
package com.atguigu.dao; import com.atguigu.bean.User; import org.springframework.stereotype.Repository; /** * @Title: UserDao * @Description: * @Author: * @Version: 1.0 * @create 2020/6/7 17:04 */ @Repository public class UserDao extends BaseDao<User> { @Override public void save() { System.out.println("USerDao...保存用户..."); } }
BaseService.java:
package com.atguigu.service; import com.atguigu.dao.BaseDao; import org.springframework.beans.factory.annotation.Autowired; /** * 此处无需加注解,因为其它服务继承了这个基础服务,相应的内容包括注解也会被继承 */ public class BaseService<T> { @Autowired private BaseDao<T> baseDao; public void save() { System.out.println("自动注入的dao" + baseDao); baseDao.save(); } }
BookService.java:
package com.atguigu.service; import com.atguigu.bean.Book; import com.atguigu.dao.BaseDao; import com.atguigu.dao.BookDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @Title: BookService * @Description: * @Author: * @Version: 1.0 * @create 2020/6/7 17:03 */ @Service public class BookService extends BaseService<Book> { }
UserService.java:
package com.atguigu.service; import com.atguigu.bean.User; import com.atguigu.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @Title: UserService * @Description: * @Author: * @Version: 1.0 * @create 2020/6/7 17:03 */ @Service public class UserService extends BaseService<User> { }
applicationContext.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> 6 7 <!-- 测试泛型依赖注入★ --> 8 <context:component-scan base-package="com.atguigu"></context:component-scan> 9 10 </beans>
IOCTest.java:
1 package com.atguigu.test; 2 3 import com.atguigu.service.BookService; 4 import com.atguigu.service.UserService; 5 import org.junit.Test; 6 import org.junit.runner.RunWith; 7 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.context.ApplicationContext; 9 import org.springframework.test.context.ContextConfiguration; 10 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 12 /** 13 * @Title: IOCTest 14 * @Description: 15 * @Author: 16 * @Version: 1.0 17 * @create 2020/6/7 17:11 18 */ 19 @ContextConfiguration(locations = "classpath:applicationContext.xml") 20 @RunWith(SpringJUnit4ClassRunner.class) 21 public class IOCTest { 22 23 @Autowired 24 private BookService bookService; 25 26 @Autowired 27 private UserService userService; 28 29 @Test 30 public void test() { 31 bookService.save(); 32 userService.save(); 33 34 //spring中可以使用带泛型的父类类型来确定这个子类的类型 35 //父类的泛型:class com.atguigu.service.BaseService 36 System.out.println(bookService.getClass().getSuperclass()); 37 38 //带泛型的父类类型:com.atguigu.service.BaseService<com.atguigu.bean.Book> 39 System.out.println(bookService.getClass().getGenericSuperclass()); 40 41 42 /** 43 * ioc总结 44 * ioc是一个容器,帮我们管理所有的组件 45 * 1.依赖注入:@Autowired:自动赋值 46 * 2.某个组件要使用Spring提供的更多(IOC、AOP)必须加入到容器中 47 * 48 * 体会: 49 * 1.容器启动,创建所有单实例bean 50 * 2.@Autowired自动装配的时候,是从容器中找这些符合要求的bean 51 * 3.ioc.getBean("bookServlet")也是从容器中找这些符合要求的bean 52 * 4.容器中包括了所有的bean 53 * 5.调试spring的源码,容器到底是什么?其实就是一个map 54 * 6.这个map中保存所有创建好的bean,并提供外界获取功能... 55 * 7.探索,单实例的bean都保存到哪个map中了【源码-扩展】 56 * 8.调试源码的思路: 57 * 从helloworld开始的,给helloworld每一个关键步骤打上断点,进去看里面都做了什么工作? 58 * 怎么知道哪些方法都是干什么的? 59 * 1)翻译这个方法是干什么的? 60 * 2)放行这个方法,看控制台,看debug的每一个变量的变化 61 * 3)看方法注释 62 * 学到的一点:1)规范注释 2)规范方法名和类名 63 */ 64 65 } 66 }
关系图解: