Spring基础-01

/**
* 几个细节:
* 1)、ApplicationContext(IOC容器的接口)
* 2)、给容器中注册一个组件;我们也从容器中按照id拿到了这个组件的对象?
* 组件的创建工作,是容器完成;
* Person对象是什么时候创建好了呢?
* 容器中对象的创建在容器创建完成的时候就已经创建好了;
* 3)、同一个组件在ioc容器中是单实例的;容器启动完成都已经创建准备好的;
* 4)、容器中如果没有这个组件,获取组件?报异常
* org.springframework.beans.factory.NoSuchBeanDefinitionException:
* No bean named 'person03' is defined
* 5)、ioc容器在创建这个组件对象的时候,(property)会利用setter方法为javaBean的属性进行赋值;
* 6)、javaBean的属性名是由什么决定的?getter/setter方法是属性名;set去掉后面那一串首字母小写就是属性名;
* private String lastName;?
* 所有getter/setter都自动生成!
*/

    <bean id="person01" class="com.atguigu.bean.Person">
        <!--使用property标签为对象属性赋值
        name="lastName":指定属性名
        value="张三":为这个属性赋值
        -->
        <property name="lastName" value="张三"></property>
        <property name="age" value="18"></property>
        <property name="email" value="zhangsan@atguigu.com"></property>
        <property name="gender" value="男"></property>
    </bean>

 

    <!--有参构造器的使用,掌握-->
    <bean id="person03" class="com.atguigu.bean.Person">
        <constructor-arg name="lastName" value="小明" />
        <constructor-arg name="email" value="123@qq.com"></constructor-arg>
        <constructor-arg name="gender" value="男"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
    </bean>

 

Person.java:

import lombok.Data;
import lombok.ToString;

import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * @Title: Person
 * @Description:
 * @Author:
 * @Version: 1.0
 * @create 2020/6/4 21:47
 */
@Data
@ToString
public class Person {

    private String lastName = "小明";
    private Integer age;
    private String gender;
    private String email;

    private Car car;

    private List<Book> books;

private Map<String,Object> maps;

private Properties properties;

//容器中对象的创建在容器创建完成的时候就已经创建好了
    public Person() {
        System.out.println("Person创建了...");
    }

    public Person(String lastName, Integer age, String gender, String email) {
        this.lastName = lastName;
        this.age = age;
        this.gender = gender;
        this.email = email;
        System.out.println("有参构造器...");
    }
}

Car.java:

import lombok.Data;
import lombok.ToString;

/**
 * @Title: Car
 * @Description:
 * @Author:
 * @Version: 1.0
 * @create 2020/6/5 11:16
 */
@Data
@ToString
public class Car {

    private String carName;
    private Integer price;
    private String color;
}

Book.java:

import lombok.Data;
import lombok.ToString;

/**
 * @Title: Book
 * @Description:
 * @Author:
 * @Version: 1.0
 * @create 2020/6/5 11:18
 */
@Data
@ToString
public class Book {

    private String bookName;
    private String author;

}

ioc.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!--suppress ALL -->
 3 <beans xmlns="http://www.springframework.org/schema/beans"
 4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5        xmlns:p="http://www.springframework.org/schema/p"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 7 
 8     <bean id="person01" class="com.atguigu.bean.Person">
 9         <!--使用property标签为对象属性赋值
10         name="lastName":指定属性名
11         value="张三":为这个属性赋值
12         -->
13         <property name="lastName" value="张三"></property>
14         <property name="age" value="18"></property>
15         <property name="email" value="zhangsan@atguigu.com"></property>
16         <property name="gender" value="男"></property>
17     </bean>
18 
19     <bean id="person02" class="com.atguigu.bean.Person">
20         <property name="lastName" value="小花"></property>
21     </bean>
22 
23     <!--有参构造器的使用,掌握-->
24     <bean id="person03" class="com.atguigu.bean.Person">
25         <constructor-arg name="lastName" value="小明" />
26         <constructor-arg name="email" value="123@qq.com"></constructor-arg>
27         <constructor-arg name="gender" value="男"></constructor-arg>
28         <constructor-arg name="age" value="18"></constructor-arg>
29     </bean>
30 
31     <bean id="person04" class="com.atguigu.bean.Person" p:age="16" p:email="456@qq.com">
32     </bean>
33 
34     <!--正确的为各种属性赋值-->
35 
36 </beans>

ioc2.xml:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!--suppress ALL -->
  3 <beans xmlns="http://www.springframework.org/schema/beans"
  4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5        xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util"
  6        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
  7 
  8     <!--正确的为各种属性赋值-->
  9     <!--实验:正确的为各种属性赋值
 10         测试使用null值 、
 11         引用类型赋值(引用其他bean、引用内部bean)
 12         集合类型赋值(List、Map、Properties)、
 13         util名称空间创建集合类型的bean
 14         级联属性赋值-->
 15 
 16     <bean id="car01" class="com.atguigu.bean.Car">
 17         <property name="carName" value="宝马"/>
 18         <property name="color" value="绿色"/>
 19         <property name="price" value="30000"/>
 20     </bean>
 21 
 22     <bean id="person01" class="com.atguigu.bean.Person">
 23         <!--测试使用null值-->
 24         <property name="lastName">
 25             <!--进行复杂赋值-->
 26             <null/>
 27         </property>
 28 
 29         <!-- ref:代表引用外面的一个值 -->
 30         <property name="car"ref="car01"></property>
 31     </bean>
 32 
 33     <bean id="book01" class="com.atguigu.bean.Book">
 34         <property name="bookName"value="水浒传"/>
 35     </bean>
 36 
 37     <bean id="person02" class="com.atguigu.bean.Person">
 38         <!--如何为list类型赋值-->
 39         <property name="books">
 40             <!--books = new ArrayList<Book>()-->
 41             <list>
 42                 <!--list标签体中添加每一个元素-->
 43                 <bean id="book000x" class="com.atguigu.bean.Book" p:bookName="西游记"></bean>
 44                 <!--引用一个外部元素-->
 45                 <ref bean="book01"/>
 46             </list>
 47         </property>
 48 
 49         <!--map集合赋值-->
 50         <property name="maps">
 51             <!-- maps = new LinkedHashMap<>() -->
 52             <map>
 53                 <!--一个entry代表一个键值对-->
 54                 <entrykey="key01"value="张三"></entry>
 55                 <entry key="key02" value="18"></entry>
 56                 <!--value-ref:指向对象-->
 57                 <entry key="key03"value-ref="book01"/>
 58                 <entry key="key04">
 59                     <bean class="com.atguigu.bean.Car">
 60                         <property name="carName" value="宝马"/>
 61                     </bean>
 62                 </entry>
 63                 <entry key="key05">
 64                     <value>李四</value>
 65                 </entry>
 66                 <!--<entry key="key05">
 67                     <map></map>
 68                 </entry>-->
 69             </map>
 70         </property>
 71 
 72         <!--properties属性赋值-->
 73         <property name="properties">
 74             <!--properties = new Properties(); 所有的 key,value都是string类型-->
 75             <props>
 76                 <!--k,v都是String类型 值直接写在标签体中-->
 77                 <prop key="username">root</prop>
 78                 <prop key="password">123456</prop>
 79             </props>
 80         </property>
 81     </bean>
 82 
 83     <!-- util 名称空间创建集合类型的bean:方便别人引用-->
 84     <bean id="person03" class="com.atguigu.bean.Person">
 85         <property name="maps"ref="myMap"></property>
 86     </bean>
 87 
 88     <util:mapid="myMap">
 89         <!--添加元素-->
 90         <entry key="key01" value="王五"></entry>
 91         <entry key="key02" value="田七"></entry>
 92     </util:map>
 93 
 94     <util:list id="myList">
 95         <list></list>
 96         <bean class="com.atguigu.bean.Person"></bean>
 97         <value>12</value>
 98         <ref bean="myMap"/>
 99     </util:list>
100 
101     <!-- 级联属性:属性的属性
102         注意:引用的级联属性,修改后会导致原来的bean也会被修改
103     -->
104     <bean id="person04" class="com.atguigu.bean.Person">
105         <!--为car赋值的时候,改变某一属性(价格)的值-->
106         <property name="car" ref="car01"></property>
107         <property name="car.price" value="900000"></property>
108     </bean>
109 
110     <!-- 通过继承实现bean配置信息的重用 -->
111     <!--通过abstract属性创建一个模板bean-->
112     <!--abstract="true":这个bean的配置是一个抽象的,不能获取它的实例,只能被别人用来继承-->
113     <bean id="person05" class="com.atguigu.bean.Person"abstract="true">
114         <property name="lastName" value="张三"></property>
115         <property name="age" value="18"></property>
116         <property name="gender" value="男"></property>
117         <property name="email" value="zhangsan@qq.com"></property>
118     </bean>
119     <!--parent:指定当前bean的配置信息继承于那个,只是信息-->
120     <bean id="person06" class="com.atguigu.bean.Person"parent="person04">
121         <property name="lastName" value="李四"/>
122     </bean>
123 
124 </beans>

AirPlane.java:

import lombok.Data;

/**
 * @Title: AirPlane
 * @Description:
 * @Author:
 * @Version: 1.0
 * @create 2020/6/5 20:38
 */
@Data
public class AirPlane {

    private String fdj;//发动机
    private String yc;//机翼长度
    private Integer personNum;//载客量
    private String jzName;//机长名字
    private String fjsName;//副驾驶

}

AirPlaneStaticFactory.java:

import com.atguigu.bean.AirPlane;

/**
 * @Title: InstanceFactory
 * @Description:静态工厂
 * @Author:
 * @Version: 1.0
 * @create 2020/6/5 20:46
 */
public class AirPlaneStaticFactory {

    //AirPlaneStaticFactory.getAirPlane()
    public static AirPlane getAirPlane(String jzName) {
        System.out.println("AirPlaneStaticFactory...正在造飞机");
        AirPlane airPlane = new AirPlane();
        airPlane.setFdj("太行");
        airPlane.setFjsName("lfy");
        airPlane.setJzName(jzName);
        airPlane.setPersonNum(300);
        airPlane.setYc("198.98m");
        return airPlane;
    }
}

AirPlaneInstanceFactory.java:

import com.atguigu.bean.AirPlane;

/**
 * @Title: InstanceFactory
 * @Description:实例工厂
 * @Author:
 * @Version: 1.0
 * @create 2020/6/5 20:46
 */
public class AirPlaneInstanceFactory {

    //new AirPlaneInstanceFactory().getAirPlane()
    public AirPlane getAirPlane(String jzName) {
        System.out.println("AirPlaneInstanceFactory...正在造飞机");
        AirPlane airPlane = new AirPlane();
        airPlane.setFdj("太行");
        airPlane.setFjsName("lfy");
        airPlane.setJzName(jzName);
        airPlane.setPersonNum(300);
        airPlane.setYc("198.98m");
        return airPlane;
    }
}

MyFactoryBeanImpl.java:

import com.atguigu.bean.Book;
import org.springframework.beans.factory.FactoryBean;

import java.util.UUID;

/**
 * @Title: MyFactoryBeanImpl
 * @Description: 实现了FactoryBean接口的类是spring可以认识的工厂类
 * Spring会自动的调用工厂方法创建实例
 *
 * 1.编写FactoryBean的实现类
 * 2.在spring配置文件中进行注册
 */
public class MyFactoryBeanImpl implements FactoryBean<Book> {

    /**
     * getObject:工厂方法
     *      返回创建的对象
     */
    @Override
    public Book getObject() throws Exception {
        System.out.println("MyFactoryBeanImpl帮你创建对象");
        Book book = new Book();
        book.setBookName(UUID.randomUUID().toString());
        return book;
    }

    /**
     * 返回创建的对象类型
     * Spring会自动调用这个方法来确认创建的对象是什么类型
     */
    @Override
    public Class<?> getObjectType() {
        return Book.class;
    }

    /**
     * isSingleton:是单例?
     * false:不是单例
     * true:是单例
     */
    @Override
    public boolean isSingleton() {
        return false;
    }
}

ioc3.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 5 
 6     <!--原来是按照配置文件的顺序创建bean-->
 7     <!--<bean id="person" class="com.atguigu.bean.Person"></bean>
 8     <bean id="car" class="com.atguigu.bean.Car"></bean>
 9     <bean id="book" class="com.atguigu.bean.Book"></bean>-->
10 
11     <!--改变bean的创建顺序-->
12     <!--bean之间的依赖(只是改变创建顺序)-->
13     <!--创建car之前,先创建person和book 创建顺序:person,book,car-->
14     <!--<bean id="car" class="com.atguigu.bean.Car" depends-on="person,book"></bean>-->
15     <bean id="car" class="com.atguigu.bean.Car" depends-on="person"></bean>
16     <bean id="person" class="com.atguigu.bean.Person"></bean>
17     <!--<bean id="book" class="com.atguigu.bean.Book"></bean>-->
18 
19     <!--测试bean的作用域,分别创建单实例和多实例的bean★
20         bean的作用域:指定bean是否单实例。xxx:默认:单实例的
21         prototype:多实例的
22             1)容器启动默认不会去创建多实例bean
23             2)获取的时候会创建这个bean
24             3)每次获取都会创建一个新的实例,每个实例不相等
25         singleton:单实例的(默认)
26             1)在容器启动完成之前就已经创建好对象,保存在容器中了
27             2)任何时候获取都是获取之前创建好的那个对象
28         request:在web环境下,同一次请求创建一个Bean实例(没用)
29         session:在web环境下,同一次会话创建一个Bean实例(没用)
30     -->
31     <bean id="book" class="com.atguigu.bean.Book"scope="prototype"></bean>
32 
33     <!--难点:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、FactoryBean★-->
34     <!--bean的创建默认就是框架利用反射new出来的bean实例-->
35     <!--工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这个类就是工厂
36         AirPlane ap = AirPlaneFactory.getAirPlane(String jzName);
37 
38         静态工厂:工厂本身不用创建对象,通过静态方法调用,工程类.工厂方法名()
39         实例工厂:工厂本身需要创建对象,
40             工厂类  工厂对象 = new 工厂类();
41             工厂对象.getAirPlane();
42     -->
43     <!--1.静态工厂(不需要创建工厂本身)
44         factory-method="getAirPlane":指定哪个方法是工厂方法
45         class:指定静态工厂去全类名
46         factory-method:指定工厂方法
47         constructor-arg:可以为方法传参
48     -->
49     <bean id="airPlane01" class="com.atguigu.factory.AirPlaneStaticFactory"factory-method="getAirPlane">
50         <!--可以为方法指定参数-->
51         <!--一个参数可省略name-->
52         <constructor-argname="jzName" value="李四"></constructor-arg>
53     </bean>
54 
55     <!--2.实例工厂对象
56         factory-method:指定这个实例工厂中哪个是工厂方法
57     -->
58     <bean id="airPlaneInstanceFactory" class="com.atguigu.factory.AirPlaneInstanceFactory"></bean>
59     <!--factory-bean:指定当前对象创建使用哪个工厂
60         1.先配置出实例工厂对象
61         2.配置我们要创建的AirPlane使用哪个工厂创建
62             1)factory-bean:指定使用哪个工厂实例
63             2)factory-method:使用哪个工厂方法
64     -->
65     <bean id="airPlane02" class="com.atguigu.bean.AirPlane"factory-bean="airPlaneInstanceFactory" factory-method="getAirPlane">
66         <constructor-arg name="jzName" value="王五"></constructor-arg>
67     </bean>
68 
69     <!--FactoryBean:是spring规定的一个接口,
70         只要是这个接口的实现类,spring都认为是一个工厂
71         1.ioc容器启动的时候不会创建实例
72         2.FactoryBean获取的时候才创建对象
73     -->
74     <bean id="myFactoryBeanImpl" class="com.atguigu.factory.MyFactoryBeanImpl"></bean>
75 
76 </beans>

 

posted @ 2020-06-05 22:36  清晨的第一抹阳光  阅读(131)  评论(0编辑  收藏  举报