激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

香港云服务器
服務(wù)器之家 - 編程語言 - Java教程 - JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式

JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式

2022-02-17 14:53丶_62f3 Java教程

這篇文章主要介紹了JavaBean和SpringBean的區(qū)別及創(chuàng)建SpringBean方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一:對象,JavaBean,SpringBean的區(qū)別

1.什么是JavaBean

javaBean要求所有屬性為私有,該類必須有一個(gè)公共無參構(gòu)造函數(shù),private屬性必須提供公共的Getter setter給外部訪問

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * @author yzh
 * @date 2021/4/29 8:42
 **/
public class User {
    //javaBean要求所有屬性為私有,該類必須有一個(gè)公共無參構(gòu)造函數(shù),private屬性必須提供公共的Getter setter給外部訪問
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2.什么是SpringBean

SpringBean是受Spring管理的對象,所有能受Spring管理的對象都可以是SpringBean

3.SpringBean和JAVABean的區(qū)別

  • 用處不同:傳統(tǒng)javabean更多地作為值傳遞參數(shù),而spring中的bean用處幾乎無處不在,任何組件都可以被稱為bean
  • 寫法不同:傳統(tǒng)javabean作為值對象,要求每個(gè)屬性都提供getter和setter方法;但spring中的bean只需為接受設(shè)值注入的屬性提供setter方法

生命周期不同:傳統(tǒng)javabean作為值對象傳遞,不接受任何容器管理其生命周期;spring中的bean有spring管理其生命周期行為

二:如何定義一個(gè)SpringBean

準(zhǔn)備工作:引入Spring依賴包

?
1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.14.RELEASE</version>
</dependency>

1.通過ClassPathXmlApplicationContext

通過ClassPathXmlApplicationContext需要指定configLocation,所有我們現(xiàn)在resources目錄下新建一個(gè)Spring.xml文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    <!-- 使用設(shè)值注入方式裝配實(shí)例 -->
    <bean id="user1" class="org.example.bean.User">
        <property name="name" value="zhangsan" />
    </bean>
    <!-- 使用構(gòu)造方法裝配實(shí)例 -->
    <!--使用構(gòu)造方法裝配需要在相應(yīng)類提供構(gòu)造函數(shù)-->
    <bean id="user2" class="org.example.bean.User">
        <constructor-arg index="0" value="lisi" />
    </bean>
</beans>

同時(shí)相應(yīng)對象重寫toString方法,便于更好觀察user1和user2

?
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
package org.example.bean;
/**
 * @author yzh
 * @date 2021/4/29 8:42
 **/
public class User {
    //javaBean要求所有屬性為私有,該類必須有一個(gè)公共無參構(gòu)造函數(shù),private屬性必須提供公共的Getter setter給外部訪問
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User(String name) {
        this.name = name;
    }
    public User() {
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

運(yùn)行測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.example.bean;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @author yzh
 * @date 2021/4/29 8:45
 **/
public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext();
        classPathXmlApplicationContext.setConfigLocation("Spring.xml");
        classPathXmlApplicationContext.refresh();
        User user1 = classPathXmlApplicationContext.getBean("user1",User.class);
        System.out.println(user1);
        User user2 = classPathXmlApplicationContext.getBean("user2", User.class);
        System.out.println(user2);
    }
}

運(yùn)行結(jié)果如下

User{name='zhangsan'}

User{name='lisi'}

2.通過AnnotationConfigApplicationContext底層

也是通過BeanDefinition實(shí)現(xiàn)

*@Bean@Component@Service@Controller都可以;一般@Service用于Service層,@Controller用于Controller層,此處以@Bean為例

新建一個(gè)Config類,并給User打上@Bean標(biāo)簽

?
1
2
3
4
5
6
7
8
9
10
11
12
package org.example.bean;
import org.springframework.context.annotation.Bean;
/**
 * @author yzh
 * @date 2021/4/29 9:20
 **/
public class Config {
    @Bean
    public User user(){
        return  new User();
    }
}

通過AnnotationConfigApplicationContext獲取bean,并打印bean對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package org.example.bean;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @author yzh
 * @date 2021/4/29 8:45
 **/
public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
        annotationConfigApplicationContext.register(Config.class);
        annotationConfigApplicationContext.refresh();
        User user = annotationConfigApplicationContext.getBean("user",User.class);
        System.out.println(user);
    }
}

運(yùn)行結(jié)果

User{name='null'}

3.通過BeanDefinition

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @author yzh
 * @date 2021/4/29 8:45
 **/
public class Main {
    public static void main(String[] args) {
  
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
 
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        //定義一個(gè)Bean
        beanDefinition.setBeanClass(User.class);
        //把生成的Bean注冊到容器中
        annotationConfigApplicationContext.refresh();
        annotationConfigApplicationContext.registerBeanDefinition("userTest",beanDefinition);
        User userTest = annotationConfigApplicationContext.getBean("userTest", User.class);
        System.out.println(userTest);
    }
}

運(yùn)行結(jié)果

User{name='null'}

4.通過FactoryBean

4.1通過FactoryBean與注解方式

首先新建一個(gè)Person類

?
1
2
3
4
5
6
7
8
package org.example.bean;
import org.springframework.stereotype.Component;
/**
 * @author yzh
 * @date 2021/4/29 10:00
 **/
public class Person {
}

然后新建一個(gè)PersonFactoryBean類,并實(shí)現(xiàn)FactoryBean接口,重寫其方法,為其打上@component注解, 此處和在Person類上打注解是同一效果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.example.bean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
/**
 * @author yzh
 * @date 2021/4/29 10:01
 **/
@Component("person")
public class PersonFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        return new Person();
    }
    @Override
    public Class<?> getObjectType() {
        return Person.class;
    }
}

其次添加一個(gè)Config類打上@ComponentScan("org.example.bean"),目的是為了掃描包下的注解

?
1
2
3
4
5
6
7
8
9
package org.example.bean;
import org.springframework.context.annotation.ComponentScan;
/**
 * @author yzh
 * @date 2021/4/29 9:20
 **/
@ComponentScan("org.example.bean")
public class Config {
}

最后通過AnnotationConfigApplicationContext獲取Bean

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @author yzh
 * @date 2021/4/29 8:45
 **/
public class Main {
    public static void main(String[] args) {
         //Config類為包掃描配置類
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);
        Person person = annotationConfigApplicationContext.getBean("person", Person.class);
        System.out.println(person);
    }
}

運(yùn)行結(jié)果

org.example.bean.Person@28ac3dc3

4.2通過Factory和BeanDefinition

1.同4.1一樣新建一個(gè)Person類

2.同4.1一樣新建一個(gè)PersonFactoryBean類,實(shí)現(xiàn)FactoryBean接口,但是不打注解

3.通過BeanDefinition獲取對象

此處和注解生成的差別在于通過BeanDefinition注冊的會生成兩個(gè)Bean對象,一個(gè)是person對應(yīng)的類型是Person,另一個(gè)是&person對應(yīng)的類型是PersonFactoryBean,通過下面代碼的getBean方法可以看出來!!

?
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
package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * @author yzh
 * @date 2021/4/29 8:45
 **/
public class Main {
    public static void main(String[] args) {
  
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);
    
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        ////定義一個(gè)Bean
        beanDefinition.setBeanClass(PersonFactoryBean.class);
        //把生成的Bean注冊到容器中
        //annotationConfigApplicationContext.refresh();
        //此處會生成2個(gè)Bean對象 第一個(gè)對象為&person對應(yīng)的類型的PersonFactoryBean 第二個(gè)對象為person對應(yīng)的類型為Person;
        annotationConfigApplicationContext.registerBeanDefinition("person",beanDefinition);
        PersonFactoryBean personFactoryBean = annotationConfigApplicationContext.getBean("&person", PersonFactoryBean.class);
        System.out.println(personFactoryBean);
        Person person = annotationConfigApplicationContext.getBean("person", Person.class);
        System.out.println(person);
    }
}

運(yùn)行結(jié)果如下

org.example.bean.PersonFactoryBean@3aeaafa6

org.example.bean.Person@76a3e297

FactoryBean接口提供三個(gè)方法,但是我們重寫了兩個(gè)方法,這是因?yàn)榱硗庖粋€(gè)方法是默認(rèn)實(shí)現(xiàn)了的

FactoryBean接口方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package org.springframework.beans.factory;
import org.springframework.lang.Nullable;
public interface FactoryBean<T> {
    
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
    @Nullable
    T getObject() throws Exception;
    
    @Nullable
    Class<?> getObjectType();
    //默認(rèn)實(shí)現(xiàn)方法,是否是單例
    default boolean isSingleton() {
        return true;
    }
}

5.通過Supplier

?
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
package org.example.bean;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.function.Supplier;
/**
 * @author yzh
 * @date 2021/4/29 8:45
 **/
public class Main {
    public static void main(String[] args) {
     
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
        annotationConfigApplicationContext.refresh();
        annotationConfigApplicationContext.registerBean(User.class, new Supplier<User>() {
            @Override
            public User get() {
                User user = new User();
                user.setName("123");
                return user;
            }
        });
        User user = annotationConfigApplicationContext.getBean("user", User.class);
        System.out.println(user);
    }
}

bean的注入方式本文只是提供了多種api,很多情況下底層其實(shí)用的都是一樣的東西,只是提供了不同的使用方式,具體可以通過源碼查看。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jianshu.com/p/2e6e07e59599

延伸 · 閱讀

精彩推薦
457
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
主站蜘蛛池模板: 午夜视频在线看 | 欧美黄 片免费观看 | 99www| 欧美激情综合网 | 双性精h调教灌尿打屁股的文案 | 久久国产精品成人免费网站 | 欧美一级黄色免费看 | 毛片在线免费观看视频 | 中国嫩模一级毛片 | 国产精品自在线拍 | 久久精品亚洲欧美日韩精品中文字幕 | 国产一区二区三区在线视频 | 中国美女一级黄色大片 | 欧美一级淫片a免费播放口 九九视频精品在线 | 日本一区视频在线观看 | 水卜樱一区二区av | 成人av一二三区 | 国产精品久久久久久久久久电影 | 国产一区视频在线观看免费 | 极品大长腿啪啪高潮露脸 | 久久成人福利 | 久久精国 | 免费在线观看毛片视频 | 免费看黄色三级毛片 | www久| 夜夜b| av成人在线电影 | 91精品国产日韩91久久久久久360 | 黄污在线观看 | 精品国产一区二区三区久久久狼牙 | 国产精品久久久久久久久岛 | free japan xxxxhdsex69| 成人在线视频免费观看 | 欧美一级黄色网 | 69性欧美高清影院 | 色淫网站免费视频 | 久久99精品久久久久久秒播放器 | 日韩精品羞羞答答 | 国产一区视频在线观看免费 | 一级毛片播放 | 久久免费视频精品 |