中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

網(wǎng)站建設(shè)崗位工作范圍網(wǎng)絡(luò)優(yōu)化工程師吃香嗎

網(wǎng)站建設(shè)崗位工作范圍,網(wǎng)絡(luò)優(yōu)化工程師吃香嗎,網(wǎng)站合同 下載,花式表白網(wǎng)址作者:~小明學(xué)編程 文章專欄:Spring框架 格言:熱愛編程的,終將被編程所厚愛。 目錄 Spring更加高效的讀取和存儲(chǔ)對(duì)象 存儲(chǔ)bean對(duì)象 五大注解 關(guān)于五大類注解 對(duì)象的注入 屬性注入 構(gòu)造方法注入 Setter注入 三種注入方式的…

作者:~小明學(xué)編程?

文章專欄:Spring框架

格言:熱愛編程的,終將被編程所厚愛。
在這里插入圖片描述

目錄

Spring更加高效的讀取和存儲(chǔ)對(duì)象

存儲(chǔ)bean對(duì)象

五大注解

關(guān)于五大類注解

對(duì)象的注入

屬性注入

構(gòu)造方法注入

Setter注入

三種注入方式的區(qū)別

@Resource 和 @Autowired 的區(qū)別

Bean的作用域和生命周期

Spring的執(zhí)行流程

Bean的生命周期


Spring更加高效的讀取和存儲(chǔ)對(duì)象

存儲(chǔ)bean對(duì)象

前面我們所介紹的方法過于的繁瑣,我們可以通過注解來快速實(shí)現(xiàn)上述的功能。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.beans"></content:component-scan>
</beans>

首先是我們所依賴的資源,其中com.beans是我們所要掃描的類的包。

五大注解

  1. Controller 控制器
  2. Service 服務(wù)
  3. Repository 倉庫
  4. Configuration 配置
  5. Component 組件

利用上面這五大注解都可以完成我們對(duì)象的注入。

@Service
public class UserService {public void sayHi() {System.out.println("hi Service");}
}
@Repository
public class UserRepository {public void sayHi() {System.out.println("Hi Res");}
}
@Controller
public class UserController {public void sayHi() {System.out.println("hello");}
}
@Configuration
public class UserConfig {public void sayHi() {System.out.println("Hi Con");}
}
@Component
public class UserComponent {public void sayHi() {System.out.println("Hi Com");}
}

獲取:

    public static void main1(String[] args) {//1.獲取上下文ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.得到beanUserController userController = context.getBean("userController",UserController.class);userController.sayHi();UserService userService = context.getBean("userService",UserService.class);userService.sayHi();UserRepository userRepository = context.getBean("userRepository",UserRepository.class);userRepository.sayHi();UserConfig userConfig = context.getBean("userConfig",UserConfig.class);userConfig.sayHi();UserComponent userComponent = context.getBean("userComponent",UserComponent.class);userComponent.sayHi();}

獲取的時(shí)候我們需要注意這個(gè)beanname,這個(gè)beanname是根據(jù)如下的邏輯。

關(guān)于五大類注解

既然我們五種注解的隨便一種都能完成我們的對(duì)象的注入,那么我們?yōu)槭裁催€是需要五種注解呢

?因?yàn)槲覀円粋€(gè)軟件是分為多個(gè)層面的,分為多層有助于我們的管理和控制。

Configuration 就是配置層:關(guān)于當(dāng)前項(xiàng)目中的所有配置,都會(huì)寫在這個(gè)文件夾里。
Controller 就是控制層:就是前端參數(shù)校驗(yàn),主要就是校驗(yàn)前端數(shù)據(jù)的合理性和正確性。
Service 就是服務(wù)層,負(fù)責(zé)數(shù)據(jù)的組裝和接口調(diào)用。更直白的說,服務(wù)器九四 “牽線搭橋” 讓程序去調(diào)用對(duì)應(yīng)的功能/接口/服務(wù)。
Repository 叫做倉庫,但其實(shí)是 數(shù)據(jù)持久層,也叫做 Dao 層,就是對(duì)數(shù)據(jù)進(jìn)行持久化操作(對(duì)數(shù)據(jù)庫進(jìn)行增刪改查操作)。

我們使用不同的注解便于我們了解不同的代碼的功能同時(shí)也方便我們對(duì)代碼進(jìn)行一個(gè)管理。

當(dāng)然這五大類注解之間是有一定的關(guān)系的:

?可以看到我們的configuration注解是調(diào)用了我們的component注解的,其它幾個(gè)注解的實(shí)現(xiàn)方法也是如此,可以說我們的component注解是我們其它四大注解的一個(gè)父類。

對(duì)象的注入

前面我們了解了怎么樣將對(duì)象給存儲(chǔ)起來,也就是使用五大注解可以高效方便的將我們的對(duì)象給放在spring中,但是當(dāng)我們想要使用的時(shí)候有沒有什么方式可以比較高效的來使用呢,下面就介紹三種方式來實(shí)現(xiàn)我們對(duì)象的一個(gè)注入。

屬性注入

通過 @Autowired 注入:

@Controller
public class UserController {@Autowiredprivate UserService userService;public void sayHi() {userService.sayHi();}
}

這里我們就通過關(guān)鍵字Autoeired的關(guān)鍵字來直接實(shí)現(xiàn)我們對(duì)象的一個(gè)注入,然在下面的方法之中我們就可以直接調(diào)用我們注入好的對(duì)象的方法了。

    public static void main(String[] args) {//1.獲取上下文ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");UserController userController = context.getBean(UserController.class);userController.sayHi();//hi Service}

構(gòu)造方法注入

@Controller
public class UserController {
//    @Autowiredprivate UserService userService;public UserController(UserService userService) {this.userService = userService;}public void sayHi() {userService.sayHi();}
}

這里我們可以直接通過構(gòu)造方法的方式來進(jìn)行對(duì)象的一個(gè)注入,但是值得我們注意的是,當(dāng)我們的構(gòu)造方法不止一個(gè)的時(shí)候就必須要使用Autowired關(guān)鍵字了,不然會(huì)報(bào)錯(cuò)。

@Controller
public class UserController {
//    @Autowiredprivate UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}public UserController(UserService userService,int num) {this.userService = userService;}public void sayHi() {userService.sayHi();}
}

Setter注入

@Controller
public class UserController {private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}public void sayHi() {userService.sayHi();}
}

同樣我們也可以使用Setter這樣一個(gè)方法來進(jìn)行一個(gè)注入。

三種注入方式的區(qū)別

  1. 屬性注入特點(diǎn)是寫法簡(jiǎn)單,但是通用性不好,只能運(yùn)行在 IoC 容器下,如果是 非 IoC 容器的話,就會(huì)出現(xiàn)問題。
  2. 構(gòu)造方法注入,通用性更好。因?yàn)闃?gòu)造方法的優(yōu)先級(jí)是最高的。確保使用注入對(duì)象之前,對(duì)象一定初始化過了。當(dāng)構(gòu)造方法注入?yún)?shù)太多時(shí),就需要檢查自己的代碼是否符合單一設(shè)計(jì)原則的規(guī)范了。構(gòu)造方法注入,也是 Spring 推薦的注入方法。
  3. Setter 注入是早期 Spring 版本推薦的寫法,但是通用性沒有構(gòu)造方法注入通用,因?yàn)橹挥幸粋€(gè)參數(shù)。

@Resource 和 @Autowired 的區(qū)別

相同點(diǎn):都可以完成對(duì)象的注入。

不同點(diǎn):

  • 出身不同,@Resource 來自于 JDK,@Autowired 是由 Spring 框架提供的。
  • @Autowired 支持屬性注入,構(gòu)造方法注入 和 Setter 注入,而 @Resource 不支持構(gòu)造方法注入。
  • 支持的參數(shù)不同:@Resource 支持更多的參數(shù)設(shè)置,比如 name、type 設(shè)置。而 @Autowired 只支持 required 參數(shù)設(shè)置。

Bean的作用域和生命周期

在我們使用bean的時(shí)候其實(shí)默認(rèn)是用的同一個(gè)bean也就是說如果我們對(duì)其中的bean進(jìn)行一個(gè)更改的話,那么當(dāng)我們?cè)俅稳ナ褂眠@個(gè)bean此時(shí)依然是更改之后的bean。

@Component
public class UserBean {@Bean(name = {"user","user1"})
//    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public User user2() {User user = new User(15,"lisi");return user;}@Bean(name = {"user2"})public User user1() {User user = new User(12,"zhangsan");return user;}
}
@Component
public class BeanScope1 {@Autowiredprivate User user2;public User getUser() {user2.setStr("aaa");return user2;}
}
@Component
public class BeanScope2 {@Autowiredprivate User user2;//user2必須事被注入過的public User getUser() {return user2;}
}

這個(gè)時(shí)候我們注入了兩次bean對(duì)象,此時(shí)查看輸入的結(jié)果:

    public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");BeanScope1 beanScope1 = context.getBean(BeanScope1.class);System.out.println(beanScope1.getUser());BeanScope2 beanScope2 = context.getBean(BeanScope2.class);System.out.println(beanScope2.getUser());}

?可以看到我們?cè)趯?duì)其進(jìn)行更改之后,再次注入仍然是更改之后的User。

產(chǎn)生這樣的原因是因?yàn)?Bean 在 Spring 中,默認(rèn)情況下是單例狀態(tài),也就是所有人的使用都是同一個(gè)對(duì)像。這樣可以很好的節(jié)約資源,避免資源的浪費(fèi)。

Bean 的六種作用域
singleton:單例作用域(默認(rèn))在這種模式下的 Bean 在 IoC 容器里面,只存在一個(gè)實(shí)例。
prototype:原型作用域(多例模式)每次對(duì)作用域下的 Bean 請(qǐng)求,都會(huì)創(chuàng)建新的實(shí)例,然后再去獲取 Bean。
request:請(qǐng)求作用域(Spring MVC)每次 Http 請(qǐng)求會(huì)創(chuàng)建新的 Bean 實(shí)例,類似于 prototype。
session:會(huì)話作用域(Spring MVC)在一個(gè) http session 中,定義一個(gè) Bean 實(shí)例。記錄用戶的登錄信息。
application:全局作用域(Spring MVC)更多人使用的時(shí)候,就用 application。也是單例模式,應(yīng)用在 Web 應(yīng)用的上下文信息。
websocket:Http WebSocket 作用域(Spring WebSocket)在 WebSocket 會(huì)話中使用。
?

當(dāng)我們想要改變其作用域的時(shí)候可以通過@Scope?的注解來進(jìn)行改變

可以看到此時(shí)我們 所注入的對(duì)象就都是新的對(duì)象了。

設(shè)置作用域的時(shí)候,只需要通過 @Scope 注解就可以了

  1. 直接設(shè)置值:@Scope(“prototype”)
  2. 使用枚舉設(shè)置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

Spring的執(zhí)行流程

1.我們首先是要啟動(dòng)我們的容器,去加載我們的配置文件。

也就是我們上面的這段代碼。

2.接著就是根據(jù)我們的配置來完成我們的bean初始化。

?通過掃描包中的spring注解。

3.注冊(cè) Bean 對(duì)象到容器中,只有在包掃描的路徑上的類,且使用 Spring 的注解才可以被注冊(cè)到容器當(dāng)中。

?4.裝配 Bean 屬性,也就是把 Bean 注冊(cè)到其他類當(dāng)中:

Bean的生命周期

Bean的生命周期就是Baen從誕生到銷毀的一個(gè)過程 。

  1. 實(shí)例化 Bean(為 Bean 分配內(nèi)存空間)
  2. 設(shè)置屬性(Bean 注入和裝配)
  3. Bean 初始化? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?a)執(zhí)行各種通知(各種Aware)如:BeanNameAware,BeanFactoryAware,ApplicationContextAware 的接口方法。
    b)執(zhí)行 BeanPostProcessor 初始化前置方法。
    c)執(zhí)行 @PostConstruct 初始化方法,依賴注入操作之后被執(zhí)行。
    d)執(zhí)行自己指定的 init-method 方法(如果有指定的話
    e)執(zhí)行 BeanPostProcessor 初始化后置方法。
  4. 使用 Bean
  5. 銷毀 Bean,通過方法來銷毀容器:如 @PreDestroy、DisposableBean、destroy-method



其大概的流程圖就是這樣的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.beans"></content:component-scan><bean id="beanLife"class="com.beans.BeanLife" init-method="init"></bean>
</beans>
package com.beans;import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** Created with IntelliJ IDEA.* Description:* User: 86184* Date: 2023-03-06* Time: 22:07*/
@Component
public class BeanLife implements BeanNameAware {@PostConstructpublic void Post() {System.out.println("PostConstruct");}@PreDestroypublic void Pre() {System.out.println("pre");}public void use() {System.out.println("use");}public void init() {System.out.println("init");}public void setBeanName(String s) {System.out.println("通知");}
}

?執(zhí)行流程如上。

http://www.risenshineclean.com/news/50427.html

相關(guān)文章:

  • 做網(wǎng)站銷售東西 需要什么資質(zhì)抖音廣告推廣
  • 武漢建筑工程有限公司搜索引擎seo關(guān)鍵詞優(yōu)化效果
  • 簡(jiǎn)單的購物網(wǎng)站源碼百度推廣充值必須5000嗎
  • 做調(diào)查賺錢的網(wǎng)站又哪些品牌傳播方案
  • 福州做網(wǎng)站公司淘寶seo排名優(yōu)化
  • 手機(jī)網(wǎng)站如何做營(yíng)銷b2c有哪些電商平臺(tái)
  • 江蘇網(wǎng)站建設(shè)定制新浪微博指數(shù)查詢
  • h5互動(dòng)的網(wǎng)站百度快照和廣告的區(qū)別
  • 電子軟件開發(fā)工資多少錢成都seo優(yōu)化公司
  • 同城購物網(wǎng)站建設(shè)泰州百度關(guān)鍵詞優(yōu)化
  • 如何查詢網(wǎng)站的備案信息國(guó)際實(shí)時(shí)新聞
  • 創(chuàng)衛(wèi)網(wǎng)站 建設(shè) 方案青島seo經(jīng)理
  • 河北 石家莊 網(wǎng)站建設(shè)青島百度競(jìng)價(jià)
  • 可做外鏈的視頻網(wǎng)站銀川seo
  • vue做的網(wǎng)站多么鄭州網(wǎng)絡(luò)推廣哪個(gè)好
  • 菏澤做網(wǎng)站電話關(guān)鍵詞詞庫
  • 手機(jī)音樂網(wǎng)站程序源碼百度點(diǎn)擊器找名風(fēng)
  • 網(wǎng)站建設(shè) 工具廈門seo排名優(yōu)化公司
  • 淄博網(wǎng)站建設(shè)公司推薦iis7站長(zhǎng)工具
  • 網(wǎng)站域名解析錯(cuò)誤怎么解決廣告優(yōu)化
  • 南昌專業(yè)網(wǎng)站建設(shè)競(jìng)價(jià)點(diǎn)擊軟件排名
  • 上海專業(yè)網(wǎng)站建設(shè)價(jià)格抖音seo軟件工具
  • wordpress用戶關(guān)系360搜索關(guān)鍵詞優(yōu)化軟件
  • 做vi的網(wǎng)站cpu優(yōu)化軟件
  • 便宜建站怎么自己找外貿(mào)訂單
  • 揭陽購物網(wǎng)站開發(fā)設(shè)計(jì)東莞網(wǎng)絡(luò)推廣培訓(xùn)
  • 青島網(wǎng)站建設(shè)的流程有哪些關(guān)鍵詞排名工具
  • 做網(wǎng)站就必須要開公司嗎珠海網(wǎng)站建設(shè)優(yōu)化
  • 免費(fèi)的網(wǎng)站在線客服軟件營(yíng)銷案例100例小故事及感悟
  • 網(wǎng)站開發(fā)的英文文獻(xiàn)互聯(lián)網(wǎng)營(yíng)銷師培訓(xùn)課程