A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦缠绕的时候 黑马粉丝团   /  2018-11-8 11:43  /  1173 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们经常见到的控制翻转(Inversion of Control-IOC) 和依赖注入(dependency injection-DI),在Spring 环境下等同的概念,控制翻转是通过依赖注入实现的。所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系,而不是通过对象本身负责自己的创建和解决自己的依赖。

Spring IOC容器(ApplicationContext)负责创建Bean ,并通过容器将功能类Bean注入到你需要的Bean中。Spring框架提供使用Xml、注解、java配置、groovy配置实现Bean 的创建和注入。

无论是 Xml 配置、注解配置还是 java 配置,都被称为元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行能力,只能通过外界代码来对这些元数据行解析后进行一些有意义的操作。Spring容器解析这些配置的元数据进行Bean初始化、配置和管理依赖。

声明Bean的注解:


  • @Component        没有明确的角色
  • @Service 在业务逻辑层(service层)使用
  • @Repository         在数据访问层(dao层)使用
  • @Controller        在表现层(MVC-->SpringMVC)使用
注入Bean的注解,一般情况下通用

  • @Autowired Spring提供的注解
  • @Inject        JSR-330提供的注释
  • @Resource        JSR-250提供的注释
@Autowired 、@Inject        、@Resource可注解在set方法上或者属性上,建议注解在属性上,有点是代码更少、层次更清晰。

一般注入规则:


从逻辑图中我们可以看出,Spring容器包含了Model层、Service层、Dao层 。 他们每一个都是Spring容器管理的一个实体类。可以通过Spring容器将一个实体类需要的另外实体类传给它。 而不采用在实体类中通过new的方式来获取实体类,因为new的方式不方便我们的使用。我们通过注入的方式,传给他需要的实体类,也就是一个实体类需要什么对象,只要被需要的对象在Spring容器管理下,我就给它什么对象,不再需要通过new的形式得到他,这样在实体类中我们就可以直接使用。

依赖注入:①注解注入

[java] view plain copy



  • <code class="language-java">(model层)  
  • package com.dependencyInjection_Di;  
  •   
  • import org.springframework.stereotype.Component;  
  •   
  • @Component  //声明Model是Spring管理的一个bean  
  • public class Model {  
  •     public String ModelName;  
  • }</code>  




  • (service层)



  • package com.dependencyInjection_Di;







  • import com.dependencyInjection_Di.ModelMapper;



  • import com.dependencyInjection_Di.Model;



  • import org.springframework.beans.factory.annotation.Autowired;



  • import org.springframework.stereotype.Service;







  • @Service(value = "modelService")  //声明ModelService是Spring管理的一个bean



  • public class ModelService {



  •     @Autowired



  •     ModelMapper modelMapper;



  •     @Autowired



  •     Model model;



  •     public void SayHello(){



  •         System.out.println("进入Service层");



  •         model.ModelName="测试完毕";



  •         modelMapper.SayHello(model);



  •     }



  • }




  • (dao层)



  • package com.dependencyInjection_Di;



  • import org.springframework.stereotype.Repository;



  • @Repository



  • public class ModelMapper {



  •     public void SayHello(Model model){



  •         System.out.print("数据持久层insert "+"\n"+model.ModelName);



  •     }



  • }


声明配置类



  • package com.dependencyInjection_Di;







  • import org.springframework.context.annotation.ComponentScan;



  • import org.springframework.context.annotation.Configuration;







  • @Configuration      //声明当前类是一个配置类



  • @ComponentScan("com.dependencyInjection_Di")  //使用ComponentScan自动扫描包下所有的@Service、@Component、@Repository、@Controller



  • public class Diconfig {



  • }



测试类


  • package com.dependencyInjection_Di;







  • import com.dependencyInjection_Di.Diconfig;



  • import com.dependencyInjection_Di.ModelService;



  • import org.springframework.context.annotation.AnnotationConfigApplicationContext;







  • public class RunningTest {



  •     /**



  •      * 用到jar包



  •      <dependency>



  •          <groupId>org.springframework</groupId>



  •          <artifactId>spring-context</artifactId>



  •          <version>4.3.12.RELEASE</version>



  •      </dependency>



  •      <dependency>



  •          <groupId>org.springframework</groupId>



  •          <artifactId>spring-core</artifactId>



  •          <version>4.3.13.RELEASE</version>



  •      </dependency>



  •      * Spring框架本身四大原则



  •      * ⑴使用POJO进行轻量级和最小侵入式开发



  •      * ⑵通过依赖注入和基于接口编程实现松耦合



  •      * ⑶通过AOP和默认习惯进行声明式编程



  •      * ⑷使用AOP和模板(template)减少模式化代码



  •      * Spring所有功能的设计和实现都是基于此四大原则



  •      * @Configuration 声明类是配置类



  •      * @ComponentScan 自动扫描目录下所有带有注解的Bean



  •      * @Service、@Controller、@Component、@Repository  是等效的,可以根据层面选择进行标识使用



  •      */



  •     public static void main(String arg[]){



  •         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Diconfig.class);



  •         ModelService modelService = (ModelService) context.getBean("modelService");



  •         modelService.SayHello();



  •     }



  • }


输出信息


  • 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。蛮多信息



  • 信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@63ee4826: startup date [Thu Jan 18 18:14:29 CST 2018]; root of context hierarchy



  • 进入Service层



  • 数据持久层insert



  • 测试完毕



  • Process finished with exit code 0





依赖注入:②java配置注入



  • (model层)



  • package com.JavaDependencyInjection_Di;



  • public class Model



  • {



  •     public String modelName;



  • }



  • (service层)



  • package com.JavaDependencyInjection_Di;







  • import com.JavaDependencyInjection_Di.ModelMapper;



  • import com.JavaDependencyInjection_Di.Model;







  • public class ModelService {



  •     Model model;



  •     ModelMapper modelMapper;



  •     public void setModel(Model model){



  •         this.model=model;



  •     }







  •     public void setModelMapper(ModelMapper modelMapper) {



  •         this.modelMapper = modelMapper;



  •     }







  •     public void SayHello(){



  •         System.out.println("service层");



  •         model.modelName="Hello";



  •         modelMapper.SayHello(model);



  •     }



  • }




  • (dao层)



  • package com.JavaDependencyInjection_Di;



  • public class ModelMapper {



  •     public void SayHello(Model model){



  •         System.out.print("Dao层 \n");



  •         System.out.print(model.modelName);



  •         System.out.print("\n 测试完毕!");



  •     }



  • }


(配置类)


  • package com.JavaDependencyInjection_Di;







  • import com.JavaDependencyInjection_Di.ModelMapper;



  • import com.JavaDependencyInjection_Di.Model;



  • import com.JavaDependencyInjection_Di.ModelService;



  • import org.springframework.context.annotation.Bean;



  • import org.springframework.context.annotation.Configuration;







  • @Configuration   //①



  • public class JavaConfig {



  •     @Bean      //②



  •     public Model model(){



  •         return new Model();



  •     }



  •     @Bean



  •     public ModelMapper modelMapper(){



  •          return new ModelMapper();



  •     }







  •     @Bean







  •     public ModelService modelService(){



  •         ModelService modelService = new ModelService();



  •         modelService.setModelMapper(modelMapper());  //③



  •         modelService.setModel(model());



  •         return modelService;



  •     }



  •     @Bean



  •     public ModelService modelService(Model model,ModelMapper modelMapper){



  •         ModelService modelService = new ModelService();



  •         modelService.setModelMapper(modelMapper); //④



  •         modelService.setModel(model);



  •         return modelService;



  •     }



  •     /**



  •      * ①使用@Configuration 声明当前类是一个配置类,这以为着这个类里可能含有 0 个或者多个 @Bean注解,



  •      *      此处没有使用包扫描,是因为所有的 Bean 都在此类中定义了



  •      * ②使用@Bean声明当前方法 model() 返回值是一个Bean,Bean名称是方法名



  •      * ③注入 ModelMapper 的 Bean 时候直接调用 modelMapper()



  •      * ④另一种注入方式,直接将 ModelMapper  作为参数给 modelService(),这也是Spring容器提供的极好的功能,



  •      *      在 Spring 容器中,只要容器中存在某个 Bean,就可以在另一个 Bean 的声明方法参数中写入



  •      */



  • }


(测试类)


  • package com.JavaDependencyInjection_Di;







  • import com.JavaDependencyInjection_Di.JavaConfig;



  • import com.JavaDependencyInjection_Di.ModelService;



  • import org.springframework.context.annotation.AnnotationConfigApplicationContext;







  • public class RunningTest {



  •     public static void main(String arg[]){



  •         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);



  •         ModelService modelService = context.getBean(ModelService.class);



  •         modelService.SayHello();



  •     }



  • }


(运行结果)



  • 一月 18, 2018 6:31:05 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh



  • 信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7956b7c1: startup date [Thu Jan 18 18:31:05 CST 2018]; root of context hierarchy



  • service层



  • Dao层



  • Hello



  • 测试完毕!



  • Process finished with exit code 0





此乃学习笔记,记录下来希望以备自己忘记,不好地方,望多加指点。

2 个回复

倒序浏览
回复 使用道具 举报
~(。≧3≦)ノ⌒☆
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马