Spring入门+IoC注解详情【依赖注入、整合Junit、配置类】---多以案例讲述
目录
1.Spring 概述
2 . Ioc概述
3. 依赖注入
5.IoC详情【Bean创建】
6.基本注解归纳
7. 图集总结
1.Spring 概述
-
Spring是一站式框架,也就是Spring可以整合其他框架
-
Spring Ioc : 对象工厂及依赖注入
-
2 . Ioc概述
1)什么是Ioc?
-
Ioc是 Inversion Control 的缩写,即"控制反转"。
-
控制反转:将创建对象的权力,由自己【new】,反转给Spring
-
我们一般创建一个类对象都会使用new 关键字,new一个对象出来。
而控制反转就是:不在new ,而是直接将实现类对象存入Ioc容器中,从容器中进行调用即可。
-
-
Ioc 容器 : 一个以键值对的形式保存实现类对象。通过键的名称,找、调用键对应的值[类]
-
key = 对类注解声明放入Ioc容器的name名称
-
value = 注解名称下的实现类对象
-
-
图集详解
2)Ioc创建对象基础案例
-
需求
-
使用Ioc的方式创建UserService对象,并调用查询所有方法
-
2.1相关注解说明
@Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration //注解标明该类是一个配置类@ComponentScan(basePackages = "扫描需要被加载的类所在的包")
2.2图集导航【以User类为例】
-
UserService【接口】
public interface UserService { //接口类 void selectAll();}
-
UserServiceImpl【接口实现类】
-
编写功能接口及其实现类。使用@Component将实现类添加到spring容器。
@Component("userServiceImpl") //存入Ioc容器中public class UserServiceImpl implements UserService { //实现类 //查询所有 public void selectAll() { System.out.println("demo01-userService-selectAll"); }}
-
Demo01Configuration【配置类】
-
编写配置类,并扫描实现类。使用@Configuration声明配置类,使用@ComponentScan进行扫描
@Configuration //配置类@ComponentScan(basePackages = "com.czxy.demo01.service") //扫描需要被加载的类所在的包public class Demo01Configguration { }
-
TestDemo01 【测试类。使用ApplicationContext从spring容器中获得实现类。】
public class TestDemo01 { //测试类 public static void main(String[] args) { //通过处理注解,获得工厂 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo01Configguration.class); //通过工厂,获得mapper UserService userServiceImpl = (UserService) applicationContext.getBean("userServiceImpl"); //调用 userServiceImpl.selectAll(); }}
-
测试结果
-
2.3总结
-
-
• 配置类必须使用 @Configuration 进行声明
• @ComponentScan 扫描路径必须是service的包名。
3. 依赖注入
3.1相关注解说明
@Ressource(name="xxx") //xxx表示对应Dao包下@Component("xxx")注解标明的类对象@Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration //注解标明该类是一个配置类@ComponentScan(basePackages = "扫描需要被加载的类所在的包")
3.2图集导航【已User类为例】
-
UserDao【数据访问层】
-
编写UserDao,并使用@Component
-
@Component("userDao2")public class Userdao { public void selectAll(){ System.out.println("dao : selectAll"); }}
-
UserService 【实现类】
-
编写UserService,并使用@Component
-
@Component("userService2")public class UserServiceImpl implements UserService { @Override public void selectAll() { //调用dao userdao.selectAll(); System.out.println("service:selectAll"); }}
-
UserService 【实现类完善】【业务逻辑层】
-
修改UserService,提供UserDao成员变量,并使用@Resource完成注入
@Component("userService2")public class UserServiceImpl implements UserService { //将userDao1注入给UserDao //依赖注入 @Resource(name = "userDao2") private Userdao userdao ; @Override public void selectAll() { //调用dao userdao.selectAll(); System.out.println("service:selectAll"); }}
-
-
Demo02Configuration【配置类】
@Configuration //标注配置类@ComponentScan(basePackages{"com.czxy.demo02.dao","com.czxy.demo02.service"}) //标注需要被加载的类所在的包进行扫描public class Demo02Configuration {}
-
TestDemo02 【测试类】【表示层】
public class TestDemo02 { public static void main(String[] args) { //通过处理注解,获得工厂 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo02Configuration.class); // //通过工厂,获得mapper UserServiceImpl userService2 = applicationContext.getBean("userService2", UserServiceImpl.class); //调用 userService2.selectAll(); }}
-
测试结果
3.3 图集总结
-
4. 依赖注入接口【通过注解加载配置类】【整合junit】
4.1 相关注解说明
@RunWith(SpringRunner.class) //spring 整合Junit ,告诉这个类是一个spring的测试类@ContextConfiguration(classes = 配置类类名.class) //加载配置类@Ressource(name="xxx") //xxx表示对应Dao包下@Component("xxx")注解标明的类对象@Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration //注解标明该类是一个配置类@ComponentScan(basePackages = "扫描需要被加载的类所在的包")
4.2 图集导航
-
UserDao【接口】
public interface UserDao3 { void selectAll();}
-
UserDaoImpl【Dao接口实现类】【数据访问层】
@Component("userDao3") //把一个类添加到Component容器中public class UserdaoImpl3 implements UserDao3 { @Override public void selectAll() { System.out.println("userDao3接口 : selectAll"); }}
-
UserService 【接口】【业务逻辑层】
public interface UserService3 { void selectAll();}
-
UserServiceImpl 【Service接口实现类】
//实现类@Component("userService3")public class UserServiceImpl3 implements UserService3 { @Resource(name = "userDao3") //依赖注入 private UserDao3 userDao3 ; @Override public void selectAll() { userDao3.selectAll(); System.out.println("userService3 : selectAll"); }}
-
Demo03Configuration【配置类】
@Configuration //配置类@ComponentScan(basePackages = {"com.czxy.demo03"}) //所需要扫描的包public class Demo03Configuration {}
-
TestDemo03 【测试类】【表示层】
@RunWith(SpringRunner.class) //spring 整合Junit ,告诉这个类是一个spring的测试类@ContextConfiguration(classes = Demo03Configuration.class) //加载配置类public class TestDemo03 { @Resource(name = "userService3") //依赖注入 private UserService3 userService3; @Test public void testDemo03(){ userService3.selectAll(); }}
-
测试结果
4.3图集总结
5.IoC详情【Bean创建】
5.1 相关注解说明
Bean相关注解 @Component :将修饰的资源交予spring管理。 value属性:为资源命名(唯一标识)@Controller :衍生注解,与@Component作用和属性相同。特用于修饰表示层的资源。web层(Servlet层)@Service :衍生注解,与@Component作用和属性相同。特用于修饰业务逻辑层的资源。(Service层)@Repository :衍生注解,与@Component作用和属性相同。特用于修饰数据访问层的资源。 (dao层)
5.2 图集导航 【以Student为例】
-
StudentDao 【dao接口】
public interface StudentDao { //查询所有 void selectAll();}
-
StudentdaoImpl 【dao接口实现类】
@Repository("studentDao4")public class StudentDaoImpl implements StudentDao { @Override public void selectAll() { System.out.println("studentDao4 : selectAll"); }}
-
StudentService 【service接口】
public interface StudentService { void selectAll();}
-
StudentServiceImpl 【service接口实现类】
//将该类放入Ioc容器中,key : 注解名 value: 该StudentServiceImpl类@Service("studentService4")public class StudentServiceImpl implements StudentService { //依赖注入 studentDao4 = Dao包中放入Ioc中 类的键key[标注注解的名] @Resource(name = "studentDao4") private StudentDao studentDao; @Override public void selectAll() { studentDao.selectAll(); System.out.println("studentService4 : selectAll"); }}
-
StudentServlet 【servle实现类】
@Controller("studentController")public class StudentServlet { //依赖注入service @Resource(name = "studentService4") private StudentService studentService ; public void selectAll(){ studentService.selectAll(); System.out.println("studentController : selectAll"); }}
-
Demo04Configuration 【配置类】
@Configuration //标注这个一个配置类@ComponentScan(basePackages = {"com.czxy.demo4_Ioc"}) //标注放入要扫描的包的路径public class Demo04Configuration {}
-
Test04_Student 【测试类】
@RunWith(SpringRunner.class) //标注这是这个spring测试类@ContextConfiguration(classes = Demo04Configuration.class) //加载配置类public class Test04_Student { @Resource(name = "studentController") private StudentServlet studentServlet; @Test public void run(){ studentServlet.selectAll(); }}
-
测试结果
-
5.3图集总结
6.基本注解归纳
@RunWith(SpringRunner.class) //spring 整合Junit ,告诉这个类是一个spring的测试类@ContextConfiguration(classes = 配置类类名.class) //加载配置类@Ressource(name="xxx") //xxx表示对应Dao包下@Component("xxx")注解标明的类对象@Component("xxx") //注解标明将该类取明为xxx,作为键存入Ioc容器中 @Configuration //注解标明该类是一个配置类@ComponentScan(basePackages = "扫描需要被加载的类所在的包")Bean相关注解 @Component :将修饰的资源交予spring管理。 value属性:为资源命名(唯一标识)@Controller :衍生注解,与@Component作用和属性相同。特用于修饰表示层的资源。web层(Servlet层)@Service :衍生注解,与@Component作用和属性相同。特用于修饰业务逻辑层的资源。(Service层)@Repository :衍生注解,与@Component作用和属性相同。特用于修饰数据访问层的资源。 (dao层)
7. 图集总结
-
类对象都可以通过@Component() 注解加入IoC容器,但是为什么又要用@Controller、@Service、@Repository注解呢?
-
是为了更好的区分不同层,更好的体现三层架构模式
-
在我们没有为他们赋予名称时,它会默认命名为 ---> 类名的首字母该小写
-