javascript
spring注入私有字段_Spring字段依赖注入示例
spring注入私有字段
了解如何編寫Spring Field Injection示例 。 字段注入是Spring框架 依賴注入的一種 。 在本教程中,我們將編寫幾個類,并看一看現場注入工程。
有關Spring依賴注入的更多信息:
- Spring Setter依賴注入示例
- Spring構造函數依賴注入示例
- Spring依賴注入–字段vs設置器vs構造函數注入
- Spring依賴注入和控制反轉
基于字段的依賴注入
在這種類型的依賴注入中,Spring將依賴直接分配給字段。 它不同于構造函數注入或基于Setter的依賴注入 。
有趣的是,即使字段是私有的,Spring也會注入依賴項。 Spring使用Java Reflections來做到這一點。 因此,許多專家稱它為不安全。
字段注入可能是依賴注入的最簡單(但有風險)形式。 為了更好地理解它,我們假設我們有一個正在運行的Spring Boot Service 。 它是一項虛擬服務,旨在了解現場注入。
不知道如何編寫Spring Boot Rest Service?
讀這個: Sprint Boot休息服務
想更多地了解Spring Framework?
讀這個:
- Spring框架介紹
- Spring建筑
- 春天@Autowired
- Spring中的@Autowired注釋
讓我們先編寫我們的DogsService類
狗服務
此類對DogsDao具有依賴關系。 用@Autowired注釋參考變量。 有一個setter和兩個構造函數 ,分別帶有打印消息。
import com.amitph.spring.dogs.dao.DogsDao; import com.amitph.spring.dogs.repo.Dog; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; @Component public class DogsService { @Autowired private DogsDao dao; public List<Dog> getDogs() { System.out.println( "DogsService.getDogs called" ); return dao.getAllDogs(); } public void setDao(DogsDao dao) { System.out.println( "DogsService setter called" ); this .dao = dao; } public DogsService(){ System.out.println( "DogsService no-arg constructor called" ); } public DogsService(DogsDao dao) { System.out.println( "DogsService arg constructor called" ); this .dao = dao; } }狗的控制器
控制器對DogsService具有依賴性。 與服務類類似,將@Autowired批注添加到參考變量。 有帶有打印消息的setter和構造函數。
import com.amitph.spring.dogs.repo.Dog; import com.amitph.spring.dogs.service.DogsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping ( "/dogs" ) public class DogsController { @Autowired private DogsService service; @GetMapping public List<Dog> getDogs() { return service.getDogs(); } public void setService(DogsService service) { System.out.println( "DogsController setter called" ); this .service = service; } public DogsController(){ System.out.println( "DogsController no-arg constructor called" ); } public DogsController(DogsService service) { System.out.println( "DogsController arg constructor called" ); this .service = service; } }運行代碼
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | ' _| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2. 1.0 .RELEASE) 2019 - 02 - 05 06 : 34 : 14.956 INFO 69421 --- [ main] com.amitph.spring.dogs.Application : Starting Application on Amits-office-mac.local with PID 69421 (/Users/aphaltankar/Workspace/personal/dog-service-jpa/out/production/classes started by aphaltankar in /Users/aphaltankar/Workspace/personal/dog-service-jpa) 2019 - 02 - 05 06 : 34 : 14.957 INFO 69421 --- [ main] com.amitph.spring.dogs.Application : No active profile set, falling back to default profiles: default 2019 - 02 - 05 06 : 34 : 15.655 INFO 69421 --- [ main] .sdrcRepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode. 2019 - 02 - 05 06 : 34 : 15.711 INFO 69421 --- [ main] .sdrcRepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50ms. Found --- [ main] .sdrcRepositoryConfigurationDelegate : Finished Spring Data repository scanning in 50ms. Found 1 repository interfaces. 2019 - 02 - 05 06 : 34 : 16.013 INFO 69421 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$EnhancerBySpringCGLIB$1cc57cd7] is not eligible for getting processed by all BeanPostProcessors ( for example: not eligible for auto-proxying) 2019 - 02 - 05 06 : 34 : 16.318 INFO 69421 --- [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2019 - 02 - 05 06 : 34 : 16.335 INFO 69421 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2019 - 02 - 05 06 : 34 : 16.335 INFO 69421 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/ 9.0 . 12 2019 - 02 - 05 06 : 34 : 16.342 INFO 69421 --- [ main] oacatalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/aphaltankar/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] 2019 - 02 - 05 06 : 34 : 16.429 INFO 69421 --- [ main] oaccC[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2019 - 02 - 05 06 : 34 : 16.429 INFO 69421 --- [ main] osweb.context.ContextLoader : Root WebApplicationContext: initialization completed in 1419 ms 2019 - 02 - 05 06 : 34 : 16.454 INFO 69421 --- [ main] osbwservlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2019 - 02 - 05 06 : 34 : 16.457 INFO 69421 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2019 - 02 - 05 06 : 34 : 16.458 INFO 69421 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2019 - 02 - 05 06 : 34 : 16.458 INFO 69421 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'formContentFilter' to: [/*] 2019 - 02 - 05 06 : 34 : 16.458 INFO 69421 --- [ main] osbwservlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2019 - 02 - 05 06 : 34 : 16.581 INFO 69421 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool- 1 - Starting... 2019 - 02 - 05 06 : 34 : 16.702 INFO 69421 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool- 1 - Start completed. 2019 - 02 - 05 06 : 34 : 16.830 INFO 69421 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [ name: default ...] 2019 - 02 - 05 06 : 34 : 16.906 INFO 69421 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core { 5.3 . 7 .Final} 2019 - 02 - 05 06 : 34 : 16.907 INFO 69421 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found 2019 - 02 - 05 06 : 34 : 17.059 INFO 69421 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations { 5.0 . 4 .Final} 2019 - 02 - 05 06 : 34 : 17.188 INFO 69421 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect 2019 - 02 - 05 06 : 34 : 17.783 INFO 69421 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' DogsDao no-arg constructor called DogsService no-arg constructor called DogsController no-arg constructor called 2019 - 02 - 05 06 : 34 : 18.208 INFO 69421 --- [ main] ossconcurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019 - 02 - 05 06 : 34 : 18.244 WARN 69421 --- [ main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default . Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable . Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable . Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2019 - 02 - 05 06 : 34 : 18.420 INFO 69421 --- [ main] osbwembedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2019 - 02 - 05 06 : 34 : 18.422 INFO 69421 --- [ main] com.amitph.spring.dogs.Application : Started Application in 3.878 seconds (JVM running for 4.57 )所有三個無參數的控制器依次調用。 沒有調用setter或參數化的構造函數 。 還有一點要注意的是標記為@Autowired的字段是private 。
春天可以設置
Spring使用反射在對象上設置私有字段。 這聽起來很有用,但另一方面卻不安全。 現場注射,其安全性和實用性一直備受爭議。 Spring不遵守對象訪問規則。 現在,有些人可能會支持這種說法,或者說spring IoC容器管理所有對象,應該獲得對這些對象的最高控制權。
@Component public class MyClass { @Autowired private DogsController controller; @Autowired private DogsService service; @Autowired private DogsDao dao; @Autowired private ApplicationProperties properties; / business methods }作為開發人員,我一直喜歡使用Field Injection,因為它確實很簡單且可讀性更高。 您實際上可以避免編寫setter方法或構造函數,而將精力放在業務方法上。
摘要
您了解了字段注入是Spring Dependency Injection的一種 ,并編寫了幾類來查看它的工作原理。 字段注入很簡單,使類更具可讀性。 但是,出于安全考慮,許多人討厭它并避免使用它。
在接下來的部分中,我們將看到Setter注入 , Field注入 和 Constructor注入 這三種方法之間的詳細區別 。
快樂編碼!
翻譯自: https://www.javacodegeeks.com/2019/02/spring-field-dependency-injection-example.html
spring注入私有字段
總結
以上是生活随笔為你收集整理的spring注入私有字段_Spring字段依赖注入示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cf电脑英雄武器大全图片(cf英雄武器图
- 下一篇: 十大笔记本电脑排行(十大笔记本电脑排行榜