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>
  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/116970u/p/13047211.html
Copyright © 2011-2022 走看看