zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    数列分块入门九题(一):LOJ6277~6279
    Luogu P4211 [LNOI2014]LCA
    Luogu P2279 [HNOI2003]消防局的设立
    Luogu P3177 [HAOI2015]树上染色
    51Nod 1677 treecnt
    CYJian的水题大赛
    51Nod 1299 监狱逃离
    51Nod 1705 七星剑
    51Nod 1443 路径和树
    51Nod 1815 调查任务
  • 原文地址:https://www.cnblogs.com/116970u/p/13047211.html
Copyright © 2011-2022 走看看