spring基础

1:<!--  基于spring的核心xml配置文件方式,手动配置一个bean,放入到spring的容器中  -->
   <!--
    <bean>标签:定义一个实例对象,会自动被创建并交给spring容器进行管理
    id属性:被spring容器管理的实例对象的唯一标识(变量名),整个容器中,只能是唯一的(不可重复)
    class属性:指定创建当前实例对象的类型(全类名),spring底层是使用的反射机制,根据指定的目标类型,创建目标实例(必须有空参构造)
    <property>子标签:给当前创建的实例对象的属性赋值,name属性:指定对象的属性名,value属性:给对象的指定属性名赋值
实例:
<bean id="userOne" class="com.kgc.spring.bean.User">
    <property name="nickName" value="kh96_spring_one"/>
</bean>

2:  spring的依赖注入方法:

<!--  spring的依赖注入  -->
<!--  方式1:setter方法注入,通过调用setter方法,给对象属性赋值  -->
<bean id="carOne" class="com.kgc.spring.bean.Car">
    <property name="brand" value="Bmw325"/>
    <property name="factory" value="华晨"/>
    <property name="price" value="300000"/>
</bean>

<!--  方式2:构造器注入,通过构造方法,给对象属性赋值,默认是按照构造方法的参数定义顺序赋值  -->
<bean id="carTwo" class="com.kgc.spring.bean.Car">
    <constructor-arg value="AudiA4"/>
    <constructor-arg value="一汽"/>
    <constructor-arg value="320000"/>
</bean>

<!-- 构造器注入,参数赋值,还可以自定义顺序和类型 index指定参数的位置,type指定参数的类型 -->
<bean id="carThree" class="com.kgc.spring.bean.Car">
    <constructor-arg value="BenzC200" index="0"/>
    <constructor-arg value="350000" index="2" type="java.lang.Double"/>
    <constructor-arg value="北京" index="1"/>
</bean>

<!--  引入其它bean:外部bean(bean仍然在容器内,不是在当前bean标签内定义的) ,给当前对象的实体属性,通过property标签的ref属性,指定容器内的其它bean对象 -->
<bean id="teacherOne" class="com.kgc.spring.bean.Teacher">
    <property name="nickName" value="万千"/>
    <property name="position" value="班主任"/>
    <property name="car" ref="carOne"/>
</bean>

<!--  引入其它bean:内部bean(写在当前bean标签内),给当前对象的实体属性赋值,只能给当前实例对象使用,外部访问不了(私有)  -->
<bean id="teacherTwo" class="com.kgc.spring.bean.Teacher">
    <property name="nickName" value="李苏杰"/>
    <property name="position" value="班主任"/>
    <property name="car">
        <!--  内部bean,不需要定义id  -->
        <bean class="com.kgc.spring.bean.Car">
            <property name="brand" value="VolvoS60"/>
            <property name="factory" value="上海"/>
            <property name="price" value="280000"/>
        </bean>
    </property>
</bean>

<!--  集合属性注入bean:list集合  -->
<bean id="teacherThree" class="com.kgc.spring.bean.Teacher">
    <property name="nickName" value="谢群"/>
    <property name="position" value="班主任"/>
    <property name="carList">
        <list>
            <ref bean="carTwo"/>
            <ref bean="carThree"/>
        </list>
    </property>
</bean>

<!--  集合属性注入bean:map集合  -->
<bean id="teacherFour" class="com.kgc.spring.bean.Teacher">
    <property name="nickName" value="朱康"/>
    <property name="position" value="教员"/>
    <property name="carMap">
        <map>
            <entry key="小白" value-ref="carTwo"/>
            <entry key="小黑" value-ref="carThree"/>
        </map>
    </property>
</bean>

<!--  使用工厂bean,容器中添加自定义实例对象  -->
<bean id="carFactoryBean" class="com.kgc.spring.bean.CarFactoryBean"/>

3: spring容器中bean的作用域

<!--  spring容器中bean的作用域  -->
<!--  单例:singleton,是spring容器中bean的实例默认作用域 -->
<!--
    spring容器创建时,自动创建所有bean的实例,放入容器,且每个实例都是单例的,每次从容器中根据id和class获取bean对象都是同一个,并不会重复创建
-->
<bean id="busOne" class="com.kgc.spring.bean.Bus">
    <property name="brand" value="金龙"/>
    <property name="factory" value="厦门"/>
    <property name="price" value="1200000"/>
</bean>

<!--
    区别于类的单例,整个程序运行期间,有且只有唯一的实例(单例模式-懒汉和饿汉),而容器中bean的单例,不是指当前类的实例在容器中,只有唯一的实例
    而是当创建bean的实例时,此实例时单例(容器内唯一),但是同一个类的实例,容器中可以创建多个,每个都是单例的
-->
<bean id="busTwo" class="com.kgc.spring.bean.Bus">
    <property name="brand" value="宇通"/>
    <property name="factory" value="郑州"/>
    <property name="price" value="1500000"/>
</bean>

<!--  多例:prototype,不是spring容器中bean的默认作用域,需要单独指定  -->
<!--
    spring容器创建时,不会自动创建指定作用域为多列的bean的实例,而是每次通过getBean方法,获取bean的实例时,才会创建bean的实例对象,每调用一次就创建一次,返回的都是新的实例对象
-->
<bean id="busThree" class="com.kgc.spring.bean.Bus" scope="prototype">
    <property name="brand" value="中通"/>
    <property name="factory" value="山东"/>
    <property name="price" value="1800000"/>
</bean>

4:测试spring框架的初步使用,从容器中获取bean对象并使用

// 1、创建spring的核心容器对象(应用上下文对象),解析spring的核心配置文件,并将文件中的bean标签进行实例化(创建对象并赋值)
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 2、写法1:从容器中,获取实例对象,根据核心配置文件中,配置的bean标签的id属性值,不足:强制转换,容易出现转换错误
        // User userOne = (User) context.getBean("userOne");

        // 写法2:从容器中,获取实例对象,不是根据核心配置文件中,配置的bean标签的id属性值,而是根据核心配置文件中,配置的bean标签的class属性指定的目标类型
        // 不足:如果容器中存在同类型的多个实例,会报异常org.springframework.beans.factory.NoUniqueBeanDefinitionException
        // User userTwo = context.getBean(User.class);

        // 写法3:从容器中,获取实例对象,根据核心配置文件中,配置的bean标签的id属性值和class属性指定的目标类型
        User userThree = context.getBean("userTwo", User.class);

        // 从容器中,获取实例对象,默认情况下,是容器中创建好的那个实例对象,不会重复创建
        User userFour = context.getBean("userTwo", User.class);

        // 对比以前创建对象的写法(对象必须手动new创建,并手动赋值)
        /*User userOld = new User();
        userOld.setNickName("kh96_old");
        userOld.sayHello();*/

        // 3、使用从容器中获取的实例对象
        // userOne.sayHello();
        // userTwo.sayHello();
        userThree.sayHello();
        userFour.sayHello();

        // 结果为true,说明从容器获取的是同一个对象
        System.out.println(userThree == userFour);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值