国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 簡單實現Spring的IOC原理詳解

簡單實現Spring的IOC原理詳解

2021-03-08 12:15Somersames Java教程

這篇文章主要介紹了簡單實現Spring的IOC原理詳解,具有一定借鑒價值,需要的朋友可以參考下。

控制反轉(InversionofControl,縮寫為IoC)

簡單來說就是當自己需要一個對象的時候不需要自己手動去new一個,而是由其他容器來幫你提供;Spring里面就是IOC容器。

例如:

在Spring里面經常需要在Service這個裝配一個Dao,一般是使用@Autowired注解:類似如下

?
1
2
3
4
5
6
7
public Class ServiceImpl{
 @Autowired
  Dao dao;
  
 public void getData(){
   dao.getData();
 }

在這里未初始化Dao直接使用是會報出空指針異常的,那么在Spring里面的做法就是通過反射來將需要的類幫你加載進來。

下面是一個例子模擬了Spring的DI和IOC

首先寫兩個注解模擬Spring的注解:

?
1
2
3
4
5
6
7
8
9
10
11
Entity注解代表的是Spring的@Service
@Target(ElementType.TYPE) // 類
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
}
 
代表的是Spring里面的@Autowrid
@Target(ElementType.FIELD) //描述方法的
@Retention(RetentionPolicy.RUNTIME) // 僅運行時保留
public @interface Resources {
}

當注解建立完成之后再建立兩個類:
Rain類代表的是需要從其他地方獲取天氣數據(數據庫或者服務器)

?
1
2
3
4
5
public class Rain {
  public void rain(){
    System.out.println("正在下雨"); // 為了方便直接寫了
  }
}

Weather類代表的是獲取到的天氣數據

?
1
2
3
4
5
6
7
@Entity
public class Weather {
  @Resources
  Rain rain; // 這里在后面通過反射直接注入rain
  public void weather_rain() {
    rain.rain();
  }

下面是通過反射來直接注入:

首先遍歷指定的包名:這一步先省略,

首先是建立一個List模擬Spring的bean容器,即將已經裝初始化好的帶有Entity注解的類全部初始化

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Weather_reflec {
    List<Object> objectList ;
    // 模擬Spring容器
    public Weather_reflec() {
        objectList= new ArrayList<Object>();
    }
    // 在這里其實最好的做法是先找出帶有注解的類,判斷帶有Entity注解再傳入。但是為了方便直接省略了
    public void get_ref(Object object) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class<?> clazz =object.getClass();
        if(clazz.isAnnotationPresent(Entity.class)){
            //判斷是否帶有Entity注解
            Field[] fields =clazz.getDeclaredFields();
            //獲取其變量
            for (Field field :fields){
                if(field.isAnnotationPresent(Resources.class)){
                    //判斷是否需要注入
                    Class<?> rainClass=Class.forName(field.getType().getName(),false,Thread.currentThread().getContextClassLoader());
                    // 這里先將Rain類加載
                    field.set(object,rainClass.newInstance());
                    //賦給rain
                    objectList.add(object);
                    //最后將已將賦值后的Weather保存進容器
                }
            }
        }
    }
    public List<Object> returnList(){
        return objectList;
        //返回容器方便以后使用
    }

最后也就是模擬Controller里面直接使用的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class WeatherPrediction {
    public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        WeatherPrediction weatherPrediction =new WeatherPrediction();
        Weather weather =(Weather)weatherPrediction.springDo();
        weather.weather_rain();
        // 這里如果是普通調用會報空指針異常,而容器卻為其將rain這個變量賦值了,所以可以正常輸出
    }
    /*
  模擬Spring啟動過程,這一步其實可以單獨寫一個類,這一步是容器該做的,而我們并不需要去管
   */
    public Object springDo() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Weather_reflec weather_reflec =new Weather_reflec();
        // 啟動的時候就需要加載的
        Weather weather =new Weather();
        //掃描類注解后new操作然后進行下一步
        weather_reflec.get_ref(weather);
        // 將其類里面的變量進行new操作并放入容器
        Object object =weather_reflec.returnList().get(0);
        return object;
    }
    運行后輸出:正在下雨

在WeatherPrediction里面并沒有對Rain進行一個new操作但是卻可以使用,這應該是最簡單的一個模擬Spring的IOC例子了,當然Spring的IOC容器比這個強大太多了,比如需要考慮線程安全,以及各種的細節問題

總結

以上就是本文關于簡單實現Spring的IOC原理詳解的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:https://segmentfault.com/a/1190000009139271

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲一一在线 | 日韩中文字幕 | 日韩电影中文字幕 | 国产精品久久久久久久久久免费看 | 亚洲精品福利在线 | 国产在线观看一区 | 精品国产乱码久久久久久影片 | 欧美劲爆第一页 | 一区二区在线免费观看 | 久久伊99综合婷婷久久伊 | 国产一二在线 | 国产成人免费视频 | 天天爽夜夜爽夜夜爽精品视频 | 免费观看特级毛片 | 依人免费视频 | 99久久婷婷国产综合精品草原 | 日本高清不卡视频 | 亚洲天天干 | 国产精品久久久久久久久久久久久 | a级三四级黄大片 | 日韩av中文字幕在线播放 | 亚洲精品久久久久久国产 | 中文字幕视频在线 | 亚洲毛片在线 | 国产成人精品一区二区三区视频 | 国产精品一级毛片在线 | 亚洲精品视频一区 | 免费毛片黄色视频 | 久久综合久久综合久久 | 91精品国产综合久久福利软件 | 国产精品免费视频一区 | 日本高清视频在线 | 久久久极品 | 天天色av | 午夜精品一区二区三区在线播放 | 免费在线毛片 | 91国产精品 | 黄色一级网站 | 国产高清一级片 | 国产精品久久一区二区三区 | 色吧综合网 |