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 图集总结