Spring框架学习

spring入门

package com.jxb.spring.bean;

/**
 * @author 韩顺平
 * @version 1.0
 * JavaBean / Entity
 */
public class Monster {
    private Integer monsterId;
    private String name;
    private String skill;

    //全参构造器
    public Monster(Integer monsterId, String name, String skill) {
        this.monsterId = monsterId;
        this.name = name;
        this.skill = skill;
    }


    //无参构造器一定要写,Spring反射创建对象时,需要使用
    public Monster() {
    }

    public Integer getMonsterId() {
        return monsterId;
    }

    public void setMonsterId(Integer monsterId) {
        this.monsterId = monsterId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "monsterId=" + monsterId +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

package com.jxb.spring.test;
//
//import com.hspedu.spring.bean.*;
//import com.hspedu.spring.component.MyComponent;
//import com.hspedu.spring.component.UserAction;
//import com.hspedu.spring.component.UserDao;
//import com.hspedu.spring.component.UserService;
//import com.hspedu.spring.depinjection.PhoneService;
//import com.hspedu.spring.service.MemberServiceImpl;
//import com.hspedu.spring.web.OrderAction;
import com.jxb.spring.bean.Monster;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.File;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * @author 韩顺平
// * @version 1.0
// */
public class SpringBeanTest {
//
//    //通过泛型依赖来配置Bean
//    @Test
//    public void setProByDependencyInjection() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans07.xml");
//        PhoneService phoneService = ioc.getBean("phoneService", PhoneService.class);
//        phoneService.save();
//        System.out.println("ok");
//
//    }
//
//    //通过注解来配置Bean
//    @Test
//    public void setProByAutowired() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans06.xml");
//
//        UserService userService = ioc.getBean("userService", UserService.class);
//        System.out.println("ioc容器中的userService=" + userService);
//
//        UserService userService200 = ioc.getBean("userService200", UserService.class);
//        System.out.println("ioc容器中的userService200=" + userService200);
//
//        UserAction userAction = ioc.getBean("userAction", UserAction.class);
//        //System.out.println("userAction=" + userAction);
//        userAction.sayOk();
//    }
//
//    //通过注解来配置Bean
//    @Test
//    public void setBeanByAnnotation() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans05.xml");
//
//        UserDao userDao = ioc.getBean(UserDao.class);
//        //在默认情况下, 注解标识的类创建对象后,在容器中,id 为类名的首字母小写
//        UserDao userDao1 = ioc.getBean("userDao", UserDao.class);
//        System.out.println("userDao1=" + userDao1);
//
//        UserService userService = ioc.getBean(UserService.class);
//        UserAction userAction = ioc.getBean(UserAction.class);
//        MyComponent myComponent = ioc.getBean(MyComponent.class);
//
//
//        System.out.println("userDao=" + userDao);
//        System.out.println("userService=" + userService);
//        System.out.println("userAction=" + userAction);
//        System.out.println("myComponent=" + myComponent);
//
//
//
//
//
//        System.out.println("ok");
//
//    }
//
//    //通过spring el 对属性赋值
//    @Test
//    public void setBeanBySpel() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans04.xml");
//
//
//        SpELBean spELBean = ioc.getBean("spELBean", SpELBean.class);
//        System.out.println("spELBean=" + spELBean);
//    }
//
//
//    //通过自动装配来对属性赋值
//    @Test
//    public void setBeanByAutowire() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans03.xml");
//
//
//        OrderAction orderAction = ioc.getBean("orderAction", OrderAction.class);
//
//        //验证是否自动装配上OrderService
//        System.out.println(orderAction.getOrderService());
//        //验证是否自动装配上OrderDao
//        System.out.println(orderAction.getOrderService().getOrderDao());
//
//    }
//
//    //通过属性文件给bean属性赋值
//    @Test
//    public void setBeanByFile() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans03.xml");
//
//
//        Monster monster1000 = ioc.getBean("monster1000", Monster.class);
//        System.out.println("monster1000=" + monster1000);
//
//    }
//
//
//
//    @Test
//    public void testBeanPostProcessor() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans02.xml");
//
//        House house = ioc.getBean("house", House.class);
//        System.out.println("使用house=" + house);
//
//        House house02 = ioc.getBean("house02", House.class);
//        System.out.println("使用house02=" + house02);
//
//        ((ConfigurableApplicationContext)ioc).close();
//
//    }
//
//    //测试Bean的生命周期
//    @Test
//    public void testBeanLife() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        House house = ioc.getBean("house", House.class);
//
//        System.out.println("使用house=" + house);
//
//        //关闭容器
//        //1. 这里又要考察大家的java基础
//        //2. ioc的编译类型 ApplicationContext , 运行类型 ClassPathXmlApplicationContext
//        //3. 因为ClassPathXmlApplicationContext 实现了 ConfigurableApplicationContext
//        //4. ClassPathXmlApplicationContext 是有close
//        //5. 将ioc 转成ClassPathXmlApplicationContext,再调用close
//        //ioc.close();
//        //关闭ioc容器.
//        ((ConfigurableApplicationContext) ioc).close();
//
//
//    }
//
//
//    //测试Scope
//    @Test
//    public void testBeanScope() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Cat cat = ioc.getBean("cat", Cat.class);
//        Cat cat2 = ioc.getBean("cat", Cat.class);
//        Cat cat3 = ioc.getBean("cat", Cat.class);
//        System.out.println("cat=" + cat);
//        System.out.println("cat2=" + cat2);
//        System.out.println("cat3=" + cat3);
//
//    }
//
//    //测试Bean创建顺序
//    @Test
//    public void testBeanByCreate() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        System.out.println("ok");
//
//    }
//
//    //配置Bean通过继承
//    @Test
//    public void getBeanByExtends() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Monster monster11 = ioc.getBean("monster11", Monster.class);
//        System.out.println("monster11=" + monster11);
//
//        Monster monster13 = ioc.getBean("monster13", Monster.class);
//        System.out.println("monster13=" + monster13);
//
//
//    }
//
//    //通过FactoryBean获取bean
//    @Test
//    public void getBeanByFactoryBean() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Monster my_monster05 = ioc.getBean("my_monster05", Monster.class);
//        System.out.println("my_monster05=" + my_monster05);
//
//
//    }
//
//    //通过实例工厂获取bean
//    @Test
//    public void getBeanByInstanceFactory() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Monster my_monster02 = ioc.getBean("my_monster02", Monster.class);
//        //老韩要考察一把, 看看你是否理解
//        Monster my_monster03 = ioc.getBean("my_monster03", Monster.class);
//        System.out.println("my_monster02=" + my_monster02);
//        System.out.println("my_monster03=" + my_monster03);
//
//        System.out.println(my_monster02 == my_monster03);//false
//
//    }
//
//    //通过静态工厂获取bean
//    //Java基础-静态和非静态
//    @Test
//    public void getBeanByStaticFactory() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Monster my_monster01 = ioc.getBean("my_monster01", Monster.class);
//        Monster my_monster04 = ioc.getBean("my_monster04", Monster.class);
//        System.out.println("my_monster01=" + my_monster01);
//        System.out.println(my_monster01 == my_monster04);//true
//
//    }
//
//    //给属性进行级联赋值
//    @Test
//    public void setBeanByRelation() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Emp emp = ioc.getBean("emp", Emp.class);
//        System.out.println("emp=" + emp);
//
//    }
//
//    //使用util:list名称空间给属性赋值
//    @Test
//    public void setBeanByUtilList() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        BookStore bookStore = ioc.getBean("bookStore", BookStore.class);
//        System.out.println("bookStore=" + bookStore);
//
//    }
//
//    //给集合数组属性进行赋值
//    @Test
//    public void setBeanByCollection() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Master master = ioc.getBean("master", Master.class);
//        System.out.println("master=" + master);
//
//    }
//
//    //通过内部bean设置属性
//    @Test
//    public void setBeanByPro() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        MemberServiceImpl memberService2 =
//                ioc.getBean("memberService2", MemberServiceImpl.class);
//
//        memberService2.add();
//
//    }
//
//    //通过ref来设置bean属性
//    @Test
//    public void setBeanByRef() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        MemberServiceImpl memberService =
//                ioc.getBean("memberService", MemberServiceImpl.class);
//
//        memberService.add();
//
//    }
//
//    //通过p名称空间来设置属性
//    @Test
//    public void setBeanByP() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Monster monster06 = ioc.getBean("monster06", Monster.class);
//        System.out.println("monster06=" + monster06);
//    }
//
//    //通过构造器来设置属性
//    @Test
//    public void setBeanByConstructor() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        Monster monster03 = ioc.getBean("monster03", Monster.class);
//        System.out.println("monster03=" + monster03);
//    }
//
//    //通过Bean的类型来获取对象
//    @Test
//    public void getBeanByType() {
//
//        ApplicationContext ioc =
//                new ClassPathXmlApplicationContext("beans.xml");
//
//        //老师解读,直接传入class对象/类型
//        Monster bean = ioc.getBean(Monster.class);
//        System.out.println("bean=" + bean);
//    }
//
//
     @Test
    public void getMonster() {

        //老师解读
        //1. 创建容器 ApplicationContext
        //2. 该容器和容器配置文件关联
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");

        //3. 通过getBean获取对应的对象
        //   默认返回的是Object , 但是运行类型Monster
        //Object monster01 = ioc.getBean("monster01");
        Monster monster01 = (Monster) ioc.getBean("monster01");

        //4. 输出
        System.out.println("monster01=" + monster01 + " 运行类型=" + monster01.getClass());
        System.out.println("monster01=" + monster01 + "属性name=" + monster01.getName() +
                " monserid=" + monster01.getMonsterId());
//
//
//        //5. 也可以再获取的时候,直接指定Class类型, 可以在次获取
//        Monster monster011 = ioc.getBean("monster01", Monster.class);
//        System.out.println("monster011=" + monster011);
//        System.out.println("monster011.name=" + monster011.getName());
//
//
//        //6. 查看容器注入了哪些bean对象,会输出bean的id
//        System.out.println("================================");
//        String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
//        for (String beanDefinitionName : beanDefinitionNames) {
//            System.out.println("beanDefinitionName=" + beanDefinitionName);
//        }
//        System.out.println("================================");
//
//        System.out.println("ok~~~");
//    }
//
//    //验证类加载路径
//    @Test
//    public void classPath() {
//
//
//        File file = new File(this.getClass().getResource("/").getPath());
//        //看到类的加载路径
//        System.out.println("file=" + file);
    }
//
}

<?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"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="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/util
        http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<!--    &lt;!&ndash;配置House对象,演示整个Bean的生命周期-->
<!--    老师解读-->
<!--    1. init-method="init" 指定bean的初始化方法 , 在setter方法后执行-->
<!--    2. init方法执行的时机,有spring容器来控制-->
<!--    3. destroy-method="destroy" 指定bean的销毁方法, 在容器关闭的时候执行-->
<!--    4. destroy方法执行的时机,有spring容器来控制-->
<!--    &ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.bean.House" id="house"-->
<!--          init-method="init"-->
<!--          destroy-method="destroy">-->
<!--        <property name="name" value="北京豪宅"/>-->
<!--    </bean>-->

<!--    &lt;!&ndash;配置Cat对象-->
<!--        老师解读-->
<!--        1. 在默认情况下 scope属性是 singleton-->
<!--        2. 在ioc容器中, 只要有一个这个bean对象-->
<!--        3. 当程序员执行getBean时, 返回的的是同一个对象-->
<!--        4. 如果我们希望每次getBean返回一个新的Bean对象,则可以scope="prototype"-->
<!--        5. 如果bean的配置是 scope="singleton" lazy-init="true" 这时,ioc容器就不会提前创建该对象-->
<!--           , 而是当执行getBean方法的时候,才会创建对象-->


<!--    &ndash;&gt;-->
<!--    <bean id="cat" class="com.hspedu.spring.bean.Cat" scope="prototype" lazy-init="false">-->
<!--        <property name="id" value="100"/>-->
<!--        <property name="name" value="小花猫"/>-->
<!--    </bean>-->
<!--    &lt;!&ndash;测试bean对象的创建顺序-->
<!--    老师解读-->
<!--    1. 在默认情况下, bean创建的顺序是按照配置顺序来的-->
<!--    2. 但是如果我们增加了 depends-on="department01" 这时就会先创建id= department01对象-->

<!--    &ndash;&gt;-->

<!--    <bean id="student01" class="com.hspedu.spring.bean.Student" depends-on="department01"/>-->
<!--    <bean id="department01" class="com.hspedu.spring.bean.Department"/>-->

<!--    &lt;!&ndash;配置Monster对象-->
<!--    1. 如果bean指定了 abstract="true", 表示该bean对象, 是用于被继承-->
<!--    2. 本身这个bean就不能被获取/实例化-->
<!--    &ndash;&gt;-->
<!--    <bean id="monster12" class="com.hspedu.spring.bean.Monster" abstract="true">-->
<!--        <property name="monsterId" value="100"/>-->
<!--        <property name="name" value="蜈蚣精~"/>-->
<!--        <property name="skill" value="蜇人~"/>-->
<!--    </bean>-->

<!--    <bean id="monster13" class="com.hspedu.spring.bean.Monster" parent="monster12"/>-->


<!--    &lt;!&ndash;配置Monster对象&ndash;&gt;-->
<!--    <bean id="monster10" class="com.hspedu.spring.bean.Monster">-->
<!--        <property name="monsterId" value="10"/>-->
<!--        <property name="name" value="蜈蚣精"/>-->
<!--        <property name="skill" value="蜇人"/>-->
<!--    </bean>-->

<!--    &lt;!&ndash;-->
<!--    老韩解读-->
<!--    1. 配置Monster对象-->
<!--    2.但是这个对象的属性值和 id="monster10"对象属性一样-->
<!--    3.parent="monster10" 指定当前这个配置的对象的属性值从 id=monster10的对象来-->
<!--    &ndash;&gt;-->

<!--    <bean id="monster11"-->
<!--          class="com.hspedu.spring.bean.Monster"-->
<!--          parent="monster10"/>-->


<!--    &lt;!&ndash;配置monster对象,通过FactoryBean获取-->
<!--    老师解读-->
<!--    1. class 指定使用的FactoryBean-->
<!--    2. key表示就是 MyFactoryBean 属性key-->
<!--    3. value就是你要获取的对象对应key-->
<!--    &ndash;&gt;-->
<!--    <bean id="my_monster05" class="com.hspedu.spring.factory.MyFactoryBean">-->
<!--        <property name="key" value="monster04"/>-->
<!--    </bean>-->


<!--    &lt;!&ndash;配置2个实例工厂对象&ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.factory.MyInstanceFactory" id="myInstanceFactory"/>-->
<!--    <bean class="com.hspedu.spring.factory.MyInstanceFactory" id="myInstanceFactory2"/>-->
<!--    &lt;!&ndash;配置monster对象, 通过实例工厂-->
<!--    老韩解读-->
<!--    1. factory-bean 指定使用哪个实例工厂对象返回bean-->
<!--    2. factory-method 指定使用实例工厂对象的哪个方法返回bean-->
<!--    3. constructor-arg value="monster03" 指定获取到实例工厂中的哪个monster-->
<!--    &ndash;&gt;-->
<!--    <bean id="my_monster02" factory-bean="myInstanceFactory" factory-method="getMonster">-->
<!--        <constructor-arg value="monster03"/>-->
<!--    </bean>-->

<!--    <bean id="my_monster03" factory-bean="myInstanceFactory2" factory-method="getMonster">-->
<!--        <constructor-arg value="monster03"/>-->
<!--    </bean>-->

<!--    &lt;!&ndash;配置monster对象,通过静态工厂获取-->
<!--    老师解读-->
<!--    1. 通过静态工厂获取/配置bean-->
<!--    2. class 是静态工厂类的全路径-->
<!--    3. factory-method 表示是指定静态工厂类的哪个方法返回对象-->
<!--    4. constructor-arg value="monster02" value是指定要返回静态工厂的哪个对象-->
<!--    &ndash;&gt;-->
<!--    <bean id="my_monster01"-->
<!--          class="com.hspedu.spring.factory.MyStaticFactory"-->
<!--          factory-method="getMonster">-->
<!--        <constructor-arg value="monster02"/>-->
<!--    </bean>-->

<!--    <bean id="my_monster04"-->
<!--          class="com.hspedu.spring.factory.MyStaticFactory"-->
<!--          factory-method="getMonster">-->
<!--        <constructor-arg value="monster02"/>-->
<!--    </bean>-->

<!--    &lt;!&ndash;配置Dept对象&ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.bean.Dept" id="dept"/>-->
<!--    &lt;!&ndash;配置Emp对象&ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.bean.Emp" id="emp">-->
<!--        <property name="name" value="jack"/>-->
<!--        <property name="dept" ref="dept"/>-->
<!--        &lt;!&ndash;这里我希望给dept的name属性指定值[级联属性赋值]&ndash;&gt;-->
<!--        <property name="dept.name" value="Java开发部门"/>-->
<!--    </bean>-->


<!--    &lt;!&ndash;定义一个util:list 并且指定id 可以达到数据复用-->
<!--    老师说明: 在使用util:list 名称空间时候,需要引入相应的标签, 一般来说通过alt+enter会自动加入-->
<!--    , 如果没有就手动添加一下即可.-->
<!--    &ndash;&gt;-->
<!--    <util:list id="myBookList">-->
<!--        <value>三国演义</value>-->
<!--        <value>红楼梦</value>-->
<!--        <value>西游记</value>-->
<!--        <value>水浒传</value>-->
<!--    </util:list>-->
<!--    &lt;!&ndash;配置BookStore对象&ndash;&gt;-->

<!--    <bean class="com.hspedu.spring.bean.BookStore" id="bookStore">-->
<!--        <property name="bookList" ref="myBookList"/>-->
<!--    </bean>-->


<!--    &lt;!&ndash;配置Master对象-->
<!--    体会 spring 容器配置特点 依赖注入-非常灵活-->
<!--    &ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.bean.Master" id="master">-->
<!--        <property name="name" value="太上老君"/>-->
<!--        &lt;!&ndash;给list属性赋值&ndash;&gt;-->
<!--        <property name="monsterList">-->
<!--            <list>-->
<!--                &lt;!&ndash;引用的方法&ndash;&gt;-->
<!--                <ref bean="monster01"/>-->
<!--                <ref bean="monster02"/>-->
<!--                &lt;!&ndash;内部bean&ndash;&gt;-->
<!--                <bean class="com.hspedu.spring.bean.Monster">-->
<!--                    <property name="name" value="老鼠精"/>-->
<!--                    <property name="monsterId" value="100"/>-->
<!--                    <property name="skill" value="吃粮食"/>-->
<!--                </bean>-->
<!--            </list>-->
<!--        </property>-->
<!--        &lt;!&ndash;给map属性赋值&ndash;&gt;-->
<!--        <property name="monsterMap">-->
<!--            <map>-->
<!--                <entry>-->
<!--                    <key>-->
<!--                        <value>monster03</value>-->
<!--                    </key>-->
<!--                    &lt;!&ndash;这里老师使用的外部bean,引入&ndash;&gt;-->
<!--                    <ref bean="monster03"/>-->
<!--                </entry>-->
<!--                <entry>-->
<!--                    <key>-->
<!--                        <value>monster04</value>-->
<!--                    </key>-->
<!--                    <ref bean="monster04"/>-->
<!--                </entry>-->
<!--            </map>-->
<!--        </property>-->
<!--        &lt;!&ndash;给set属性赋值&ndash;&gt;-->
<!--        <property name="monsterSet">-->
<!--            <set>-->
<!--                <ref bean="monster05"/>-->
<!--                <ref bean="monster06"/>-->
<!--                <bean class="com.hspedu.spring.bean.Monster">-->
<!--                    <property name="name" value="金角大王"/>-->
<!--                    <property name="skill" value="吐水"/>-->
<!--                    <property name="monsterId" value="666"/>-->
<!--                </bean>-->
<!--            </set>-->
<!--        </property>-->
<!--        &lt;!&ndash;给数组属性赋值-->
<!--        老师多说一句: array标签中使用 value 还是 bean , ref .. 要根据你的业务决定-->
<!--        &ndash;&gt;-->
<!--        <property name="monsterName">-->
<!--            <array>-->
<!--                <value>小妖怪</value>-->
<!--                <value>大妖怪</value>-->
<!--                <value>老妖怪</value>-->
<!--            </array>-->
<!--        </property>-->
<!--        &lt;!&ndash;Properties属性赋值 结构k(String)-v(String)&ndash;&gt;-->
<!--        <property name="pros">-->
<!--            <props>-->
<!--                <prop key="username">root</prop>-->
<!--                <prop key="password">123456</prop>-->
<!--                <prop key="ip">127.0.0.1</prop>-->
<!--            </props>-->
<!--        </property>-->
<!--    </bean>-->

<!--    &lt;!&ndash;配置MemberServiceImpl对象-使用内部bean&ndash;&gt;-->
<!--    &lt;!&ndash;<bean class="com.hspedu.spring.service.MemberServiceImpl" id="memberService2">&ndash;&gt;-->
<!--    &lt;!&ndash;    &lt;!&ndash;自己配置一个内部bean&ndash;&gt;&ndash;&gt;-->
<!--    &lt;!&ndash;    <property name="memberDAO">&ndash;&gt;-->
<!--    &lt;!&ndash;        <bean class="com.hspedu.spring.dao.MemberDAOImpl"/>&ndash;&gt;-->
<!--    &lt;!&ndash;    </property>&ndash;&gt;-->
<!--    &lt;!&ndash;</bean>&ndash;&gt;-->

<!--    &lt;!&ndash;配置MemberServiceImpl对象-->
<!--        老韩解读-->
<!--        1. ref="memberDAO"表示  MemberServiceImpl对象属性memberDAO引用的对象是id=memberDAO-->
<!--        的对象-->
<!--        2. 这里就体现出spring容器的依赖注入-->
<!--        3. 注意再spring容器中, 他是作为一个整体来执行的, 即如果你引用到一个bean对象, 对你配置的顺序没有要求-->
<!--        4. 建议还是按顺序,好处是阅读的时候,比较方便-->
<!--    &ndash;&gt;-->
<!--    &lt;!&ndash;配置MemberDAOImpl对象&ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.dao.MemberDAOImpl" id="memberDAO"/>-->

<!--    <bean class="com.hspedu.spring.service.MemberServiceImpl" id="memberService">-->
<!--        <property name="memberDAO" ref="memberDAO"/>-->
<!--    </bean>-->



<!--    &lt;!&ndash;通过p名称空间来配置bean-->
<!--        老韩解读-->
<!--        1. 将光标放在p , 输入alt+enter , 就会自动的添加xmlns-->
<!--        2. 有时需要多来几次-->
<!--    &ndash;&gt;-->
<!--    <bean id="monster06" class="com.hspedu.spring.bean.Monster"-->
<!--          p:monsterId="500"-->
<!--          p:name="红孩儿"-->
<!--          p:skill="吐火"-->
<!--    />-->


<!--    &lt;!&ndash;配置Monster对象,并且指定构造器-->

<!--    老师解读-->
<!--    1. constructor-arg标签可以指定使用构造器的参数-->
<!--    2. index表示构造器的第几个参数 从0开始计算的-->
<!--    3. 除了可以通过index 还可以通过 name / type 来指定参数方式-->
<!--    4. 解除大家的疑惑, 类的构造器,不能有完全相同类型和顺序的构造器,所以可以通过type来指定-->
<!--    &ndash;&gt;-->

<!--    <bean id="monster03" class="com.hspedu.spring.bean.Monster">-->
<!--        <constructor-arg value="200" index="0"/>-->
<!--        <constructor-arg value="白骨精" index="1"/>-->
<!--        <constructor-arg value="吸人血" index="2"/>-->
<!--    </bean>-->

<!--    <bean id="monster04" class="com.hspedu.spring.bean.Monster">-->
<!--        <constructor-arg value="200" name="monsterId"/>-->
<!--        <constructor-arg value="白骨精" name="name"/>-->
<!--        <constructor-arg value="吸人血" name="skill"/>-->
<!--    </bean>-->


<!--    <bean id="monster05" class="com.hspedu.spring.bean.Monster">-->
<!--        <constructor-arg value="300" type="java.lang.Integer"/>-->
<!--        <constructor-arg value="白骨精~" type="java.lang.String"/>-->
<!--        <constructor-arg value="吸人血~" type="java.lang.String"/>-->
<!--    </bean>-->

<!--    &lt;!&ndash;配置Monster,通过类型来获取&ndash;&gt;-->
<!--    <bean class="com.hspedu.spring.bean.Monster">-->
<!--        &lt;!&ndash;老韩解读-->
<!--        1.当我们给某个bean对象设置属性的时候-->
<!--        2.底层是使用对应的setter方法完成的, 比如setName()-->
<!--        3.如果没有这个方法,就会报错-->
<!--        &ndash;&gt;-->
<!--        <property name="monsterId" value="100"/>-->
<!--        <property name="name" value="牛魔王"/>-->
<!--        <property name="skill" value="芭蕉扇"/>-->
<!--    </bean>-->

<!--    &lt;!&ndash;<bean class="com.hspedu.spring.bean.Monster">&ndash;&gt;-->
<!--    &lt;!&ndash;    <property name="monsterId" value="200"/>&ndash;&gt;-->
<!--    &lt;!&ndash;    <property name="name" value="牛魔王~"/>&ndash;&gt;-->
<!--    &lt;!&ndash;    <property name="skill" value="芭蕉扇~"/>&ndash;&gt;-->
<!--    &lt;!&ndash;</bean>&ndash;&gt;-->

<!--    &lt;!&ndash;-->
<!--        老韩解读-->
<!--        1. 配置monster对象/javabean-->
<!--        2. 在beans中可以配置多个bean-->
<!--        3. bean表示就是一个java对象-->
<!--        4. class属性是用于指定类的全路径->spring底层使用反射创建-->
<!--        5. id属性表示该java对象在spring容器中的id, 通过id可以获取到对象-->
<!--        6. <property name="monsterId" value="100"> 用于给该对象的属性赋值-->
<!--    &ndash;&gt;-->
    <bean class="com.jxb.spring.bean.Monster" id="monster01">
        <property name="monsterId" value="100"/>
        <property name="name" value="牛魔王"/>
        <property name="skill" value="芭蕉扇"/>
    </bean>

    <bean class="com.jxb.spring.bean.Monster" id="monster02">
        <property name="monsterId" value="1001"/>
        <property name="name" value="牛魔王~"/>
        <property name="skill" value="芭蕉扇~"/>
    </bean>
</beans>

你可能感兴趣的:(java框架技术栈,spring,学习,java)