最近在知乎上面看到一篇关于程序员面试的问题,面试官问我们一般有几种注入的方法,这几种注入的方法分别在什么时候运用比合理,当时我看到这个时候懵逼了,由于我自己也是刚刚接触springboot不久,所以就自己在平时运用的上面总结了一些知识点常用的几种springboot的注入方法,由于我是一个小萌新,所只要是能够起道注入的方法的注解我都列出来,有可能会有错,希望大家能够及时提出来我来解决:

  1. @Autowired
  2. @Resource
  3. @Component
  4. @Configuration
  5. @Qualifie
  6. @Bean
  7. ........

这几种常用的吗?难道还有什么其他的?当然有,下面我总结了一下自己对于这几种注入的看法和认识。

首先是我们使用频率较为高的@Autowired:

这个注解可能是我们使用频率较为频繁的一个注解的了,几乎在刚刚入门的时候,我们都会使用这个注释,那么@Autowired 注释的工作原理是什么呢?

第一:其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

第二:@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这用用的

<property name="属性名" value=" 属性值"/>

通过这种方式来,配置比较繁琐,而且代码比较多。在Spring 2.5 引入了 @Autowired 注释

我们平常直接引用的时候很少注意这些,只是自己写好了一个方法或者springboot自动配置好的一个方法我们要在另一个类中去调用,这个时候,我们就会采用该注释,例如:我已经写好一个工具类,此时,我需要在其他类中调用该工具类的方法:

/*
这是要被调用的类
*/
@Repository("userRepository")
public class UserRepositoryImps implements UserRepository{ @Override
public void save() {
System.out.println("UserRepositoryImps save is success");
}
}

已调用的类

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.proc.bean.repository.UserRepository;
/*
方法注入的类
*/
@Service
public class UserService { @Autowired
private UserRepository userRepository; public void save(){
userRepository.save();
}
}

接着我们开始聊一下@Resource这个注解:

第一:@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

第二:可以用在方法、属性、类上,通过CommonAnnotationBeanPostProcessor类实现依赖注入 与@AutoWired一致。但可以指定name属性来指定beanName,但如果name对应的bean不存在,则会抛出异常,且没有required属性。

当作用在类上面的时候:可以用来指定name

  @Resource(name = "testMapper")
private TestMapper testMapper;

第三:@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false

 @Autowired()
private StudentDao studentDao;

来,继续往下走,开始撸@Component这个注解:

第一:@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

第二:@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

例如下面的这个例子

注意:这个只能作用于类上面

package cn.com.scitc.security;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @Component("myLoginSuccessHandler")
public class MyLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired
private ObjectMapper objectMapper; @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
response.setContentType("application/json;charset=UTF-8"); logger.info("登录成功"); PrintWriter out = response.getWriter();
out.write(objectMapper.writeValueAsString("登录成功"));
out.flush();
out.close(); }
}

看了这么多,是不是有点累了,不行接着撸@Configuration的注解:

首先我们先明白从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

在使用的时候需要注意:

1.@Configuration不可以是final类型;

2.@Configuration不可以是匿名类;

3.嵌套的configuration必须是静态类。

下面讲解详细的使用

第一:用@Configuration加载spring

1.1、@Configuration配置spring并启动spring容器

1.2、@Configuration启动容器+@Bean注册Bean

1.3、@Configuration启动容器+@Component注册Bean

1.4、使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法

1.5、配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)

第二:组合多个配置类

2.1、在@configuration中引入spring的xml配置文件

2.2、在@configuration中引入其它注解配置

2.3、@configuration嵌套(嵌套的Configuration必须是静态类)

2.4、@EnableXXX注解

2.5、@Profile逻辑组配置

2.6、使用外部变量

下面讲解一个比较常用的例子:不知道各位大佬的在用在SpringBoot 中使用Security安全框架的时候会出现一个默认的登录界面,但是我们一般不回去用哪个登录界面,这时候我们就应该自己去写一个登录的界面以及后端的实行方法,那么这个时候,@configuration就派上用场了,话不多说,直接上例子:

package cn.com.scitc.config;

import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus; @Configuration
public class ErrorConfigurar {
/**
* 自定义错误页面
* @return
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() { return (factory -> {
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/500");
ErrorPage errorPage403 = new ErrorPage(HttpStatus.FORBIDDEN,"/403");
factory.addErrorPages(errorPage404);
factory.addErrorPages(errorPage403);
factory.addErrorPages(errorPage500);
});
} }

注意:该注释也是用于全局的,所以定义在类上面。

接下来来一个就比较简单的@Qualifier了,这个注解在我认为就是@Autowired的小弟,它一般和@Autowired一起用,当 @Autowired() 不带参数的时候@Qualifie就可以带上参数。Qualifier限定描述符除了能根据名字进行注入,更能进行更细粒度的控制如何选择候选者。

 @Autowired()
@Qualifie("/studentDao")
private StudentDao studentDao;

现在继续撸一个叫@Bean的注解;

很多人就会问@Bean为什么可以当做注入来用呢?在刚刚开始的时候我也是认为@Bean就是封装一个POJO类而已,可是后面我觉得它是可以用来当做注入注解来使用的。

首先,@Bean可理解为用spring的时候xml里面的<bean>标签;

其次,@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里,添加的bean的id为方法名;

@Configuration
public class AppConfig { @Bean
public TransferService transferService() {
return new TransferServiceImpl();
} }

再接着:@bean 也可以依赖其他任意数量的bean,如果TransferService 依赖 AccountRepository,我们可以通过方法参数实现这个依赖;

@Bean
public TransferService transferService(AccountRepository accountRepository) {
return new TransferServiceImpl(accountRepository);
}

最后讲一下,指定bean的scope

使用@Scope注解来指定使用@Bean定义的bean

@Scope("prototype")

设置@Scope的属性proxyMode来指定,默认是ScopedProxyMode.NO, 你可以指定为默认是ScopedProxyMode.INTERFACES或者默认是ScopedProxyMode.TARGET_CLASS

@Bean
@SessionScope
public StuPreferences stuPreferences() {
return new StuPreferences();
} @Bean
public Service StuService() {
StuService service = new SimpleStuService(); service.setStuPreferences(StuPreferences());
return service;
}

通过上面的说明,就足以说明这是可以用来注入的。

最后,我们来探讨一下private final修饰的变量可以被用来作为注入你们觉得可以吗?

试想,在一个大的项目中,几乎所有的引用都是用public、@Bean等相应的方法注入,那么就会造成代码的耦合度较高,造成了项目的维护困难,那么久只有被项目经理K一顿啦。

最后,由于我是小萌新一个,有总结不到位的,或者错误的,希望各位大佬指正出来。小弟感激不尽。

对于springboot的几种注入方法的个人看法的更多相关文章

  1. spring属性的三种注入方法

    (1)使用set方法: public class Book {  private String bookname;public void setBookname(String bookname) {  ...

  2. SpringBoot+Mybatis-Plus两种分页方法

    用到的依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus ...

  3. 两种解决springboot 跨域问题的方法示例

    两种解决springboot 跨域问题的方法示例,哪种方法看情况而定,自己选择.社会Boolean哥,人狠话不多,直接上代码. 第一种实现方式:       此种方式做全局配置,用起来更方便,但是无法 ...

  4. 将dll文件注入到其他进程中的一种新方法

    http://www.45it.com/windowszh/201212/33946.htm http://www.hx95.cn/Article/OS/201212/65095.html 我们知道将 ...

  5. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  6. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  7. WinAPI【远程注入】三种注入方案【转】

    来源:http://www.cnblogs.com/okwary/archive/2008/12/20/1358788.html 导言: 我 们在Code project(www.codeprojec ...

  8. Spring IOC 三种注入方式

    1.    接口注入 2.    setter注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...

  9. spring依赖注入方法

    依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给sprin ...

随机推荐

  1. Qt之使用setWindowFlags方法遇到的问题(追踪进入QWidget的源码分析原因,最后用WINAPI解决问题)good

    一.简述 前段时间在使用setWindowFlags方法时遇到了一个坑,具体情况是想通过窗口界面上一个checkBox来控制窗口当前状态是否置顶,而Qt提供了Qt::WindowStaysOnTopH ...

  2. How to manipulate pixels on a bitmap by scanline property(Ma Xiaoguang and Ma Xiaoming)

    We have been developing image processing software for above 14 years with old versions of Delphi, su ...

  3. AlwaysOn数据同步暂停及回退技术

    随着AlwaysOn技术的流行,关于AlwayOn的问题也越来越多,某企业搭建有三副本的AlwaysOn一套,现想修改主节点上某张表的某个数据,看看会出现什么后果,如果结果正常,就同步到其他节点上:如 ...

  4. HTTP RFC7230

    https://tools.ietf.org/html/rfc7230 https://tools.ietf.org/html/rfc7231#section-4

  5. 在Windows IoT上使用网络摄像头

    在树莓派上可以使用它官方标配的摄像头,但是这个摄像头似乎不能被Windows IoT识别和使用.但是,可以在树莓派的USB口上插入任意型号的摄像头,就可以实现树莓派的拍摄功能. 关于摄像头的寻找和拍摄 ...

  6. MySQL 主从配置 读写分离

    Master配置 1.创建用户: 在Master MySQL上创建一个用户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步. create ...

  7. SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传

    一.配置SpringMVC 二.单文件与多文件上传 三.多文件上传 四.带参数上传 一.配置SpringMVC 在spring.xml中配置: <!-- springmvc文件上传需要配置的节点 ...

  8. Dependency Injection 筆記 (2)

    续上集,接着要说明如何运用 DI 来让刚才的范例程序具备执行时期切换实现类型的能力. (本文摘自電子書<.NET 依賴注入>) 入门范例—DI 版本 为了让 AuthenticationS ...

  9. CEGUI 0.7.7 VS2010+SP3 编译过程

    1 在官方网站http://www.cegui.org.uk/ 下载最新的CEGUI 源代码 版本是0.7.7 2 下载编译需要用到的依赖文件包 将解压后的文件夹 Dependencies 和CEGU ...

  10. QTcpSocket 对连接服务器中断的不同情况进行判定

    http://blog.csdn.net/goforwardtostep/article/details/52300335