/**
* 几个细节:
* 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>