日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring总结四:IOC和DI 注解方式

發布時間:2023/12/20 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring总结四:IOC和DI 注解方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我們要了解注解和xml配置的區別:

  作用一樣,但是注解寫在Bean的上方來代替我們之前在xml文件中所做的bean配置,也就是說我們使用了注解的方式,就不用再xml里面進行配置了,相對來說注解方式更為簡便。

?

IOC獲取對象注解方式:

在我們第二篇(IOC容器配置 xml方式)總結的基礎上做修改:

首先我們的applicationContext.xml配置文件要略作修改:(把beans里面加上綠色背景的配置)

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd "><!--開啟掃描 掃描包com.zy下面的--><context:component-scan base-package="com.zy"></context:component-scan> </beans>

然后我們的JavaBean類加上注解(Component):

@Component("bean1") public class Bean1 {public Bean1() {System.out.println("Bean1的無參構造方法");} }

這樣就代替了我們之前在applicationContext.xml中配置的:?<bean id="bean1" class="com.zy.IoC.Bean1"></bean>

測試及運行結果請參照總結第二篇,得出的結果是一樣的。

?

Spring 容器還提供@Component 等效三個衍生注解

  • @Repository 用于注冊DAO(持久層 )

  • @Service 用于注冊 Service(業務層)

  • @Controller 用于注冊 Action (表現層)

以@Repository為例:

/*** 測試UserDao接口*/ public interface UserDao {public void getUser(); } /*** UserDao實現類1*/ @Repository("userDao") public class UserDaoImpl implements UserDao {public UserDaoImpl() {System.out.println("dao1 構造方法");}@Overridepublic void getUser() {System.out.println("UserDao實現類1 獲取用戶信息...");} }

測試:

@Testpublic void getUser() throws Exception {//根據spring配置文件 獲取spring容器ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//使用容器創建UserDao的實現類對象 userDao和配置文件中的 bean的id一致UserDao dao = ac.getBean("userDao", UserDao.class);dao.getUser();}

運行結果:

?

?DI依賴注入注解方式:

注解基本類型屬性:這個不多做介紹了

// 基本類型屬性 @Value("#{'張學友'}") private String name;

注解復雜類型屬性:

  1,Spring3.0提供@Value注解

// 復雜類型屬性// 第一種 @Value 結合 spEL@Value("#{userDao}")private UserDao userDao;

  2,Spring2.0 提供@Autowired 注解 結合 @Qualifier 注解

// 第二種 @Autowired 注解 結合 @Qualifier 注解// 如果單獨使用@Autowired 默認按照類型注入,如果有多個同一類型的只能找到一個// 使用 @Qualifier 按照名稱注入 @Autowired@Qualifier("userDao")private UserDao userDao;

  3,JSR-250規范 提供 @Resource 注解實現注入(不推薦使用)

// 第三種 JSR-250提供@Resource 注解// 不寫name屬性,按照類型注入,寫了name屬性,按照名稱注入@Resource(name = "userDao")private UserDao userDao;

?

以把UserDao注入到UserService為例:

JavaBean代碼:

/*** 測試UserDao接口*/ public interface UserDao {public void getUser(); } /*** UserDao實現類1*/ @Repository("userDao") public class UserDaoImpl implements UserDao {@Overridepublic void getUser() {System.out.println("2 UserDao實現類1 獲取用戶信息...");} }/*** UserService接口*/ public interface UserService {public void getUser(); } /*** UserService實現類*/ @Service("userService") public class UserServiceImpl implements UserService {//@Autowired+@Qualifier的方式//@Autowired//@Qualifier("userDao")@value("#{userDao}") //@Value("#{}")的方式 使用注解注入,要與dao實現類的注解一致(使用注解 不需要setter方法, 如果沒有構造方法,使用xml配置的時候需要setter方法)private UserDao userDao;@Overridepublic void getUser() {System.out.println("1 業務層1 獲取user對象...");userDao.getUser();} }

測試:

@Testpublic void getUser() throws Exception {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = ac.getBean("userService", UserService.class);userService.getUser();}

運行結果:

?

其他注解的使用:

生命周期注解:

@PostConstruct 初始化方法

@PreDestroy 銷毀方法

//Bean的注解 @Component("springLifeCycle") public class SpringLifeCycle {//構造方法public SpringLifeCycle() {System.out.println("SpringLifeCycle 構造...");}//初始化方法的注解 @PostConstructpublic void init() {System.out.println("SpringLifeCycle 初始化...");}//銷毀方法的注解 @PreDestroypublic void destroy() {System.out.println("SpringLifeCycle 銷毀...");}public void helloSpring() {System.out.println("hello spring !");} }

測試:

@Testpublic void testLifeCycle() {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");SpringLifeCycle springLifeCycle = (SpringLifeCycle) ac.getBean("springLifeCycle");springLifeCycle.helloSpring();// 調用close(ApplicationContext沒有close方法,需要轉子類調用close)ClassPathXmlApplicationContext classAc = (ClassPathXmlApplicationContext) ac;classAc.close();}

運行結果:

?

Bean的作用域注解:

還是上面的JavaBean類:

//Bean的注解 @Component("springLifeCycle") //作用域注解 prototype為多實例,默認為singleton單實例 @Scope("prototype") public class SpringLifeCycle {

測試:

@Testpublic void testScope() throws Exception {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");SpringLifeCycle lifeCycleBean1 = (SpringLifeCycle) applicationContext.getBean("springLifeCycle");SpringLifeCycle lifeCycleBean2 = (SpringLifeCycle) applicationContext.getBean("springLifeCycle");System.out.println(lifeCycleBean1);System.out.println(lifeCycleBean2);// 通過反射 代碼調用 close方法Method closeMethod = applicationContext.getClass().getMethod("close");closeMethod.invoke(applicationContext);}

運行結果:

大家會發現銷毀方法沒有起作用,這里說明一下,Bean必須為singleton單實例的時候,銷毀方法才能執行。

將scope設置成singleton:

//Bean的注解 @Component("springLifeCycle") //作用域注解,singleton為默認值,可以不寫這個注解 @Scope("singleton") public class SpringLifeCycle {

執行結果:

?

轉載于:https://www.cnblogs.com/blazeZzz/p/9305861.html

總結

以上是生活随笔為你收集整理的Spring总结四:IOC和DI 注解方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。