Spring基础-02
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;//副驾驶 }
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; public void myInit(){ System.out.println("这是图书的初始化方法..."); } public void myDestroy(){ System.out.println("这是图书的销毁方法..."); } public Book() { System.out.println("Book被创建..."); } }
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; public Car() { System.out.println("Car被创建..."); } }
MyBeanPostProcessor.java:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * 1.编写后置处理器的实现类 * 2.将后置处理器注册在配置文件中 */ public class MyBeanPostProcessor implements BeanPostProcessor { /** * postProcessBeforeInitialization * 初始化之前调用 * Object bean:将要初始化的bean */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization["+beanName+"]bean将要调用初始化方法了..."+bean); //返回传入的bean return bean; } /** * postProcessAfterInitialization * 初始化方法之后调用 * String beanName:xml中配置的id */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization["+beanName+"]bean初始化方法调用完了...AfterInitialization"); //初始化之后返回的bean:返回的是什么,容器中保存的就是什么 return 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 Double salary; 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("有参构造器..."); } public Person(Car car) { this.car = car; System.out.println("可以为car赋值的有参构造器..."); } }
applicationContext.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的创建和销毁 8 ioc容器中注册的bean 9 1)单例bean,容器启动的时候就会创建好,容器关闭也会销毁创建的bean 10 2)多实例bean:获取的时候才创建 11 我们可以为bean自定义一些生命周期方法,spring在创建或者销毁的时候就会调用指定的方法 12 自定义初始化方法和销毁方法:可以抛出异常,但是不可以有参数 13 --> 14 <bean id="book01" class="com.atguigu.bean.Book" destroy-method="myDestroy" init-method="myInit"></bean> 15 <bean id="book02" class="com.atguigu.bean.Book" destroy-method="myDestroy" init-method="myInit" scope="prototype"></bean> 16 17 <!--测试bean的后置处理器:BeanPostProcessor 18 后置处理器:Spring有一个接口,可以在bean的初始化前后调用方法 19 --> 20 <bean id="beanPostProcessor" class="com.atguigu.bean.MyBeanPostProcessor"></bean> 21 22 <bean class="com.atguigu.bean.Car" id="car01"></bean> 23 24 </beans>
applicationContext02.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 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> 6 7 <!--引用外部属性文件★ 依赖context,名称空间--> 8 <!--数据库连接池作为单实例是最好的,一个项目就是一个连接池,连接池里面管理很多连接,连接是直接从连接池中拿--> 9 <!--可以让spring帮我们创建连接池对象,管理连接池--> 10 <!--加载外部配置文件 11 固定写法classpath:表示引用类路径下的一个资源 12 --> 13 <context:property-placeholder location="classpath:db.properties"/> 14 15 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 16 <!--${key}:动态取出配置文件中某个key对应的值--> 17 <!--username是Spring的key中的一个关键字:为了防止配置文件中的key和spring的关键字冲突--> 18 <property name="user" value="${jdbc.username}"></property> 19 <property name="password" value="${jdbc.password}"></property> 20 <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> 21 <property name="driverClass" value="${jdbc.dirverClass}"></property> 22 </bean> 23 24 <bean id="car01" class="com.atguigu.bean.Car"> 25 <property name="carName" value="${username}"></property> 26 </bean> 27 28 <!--基于XML的自动装配(自定义类型自动赋值) 29 javaBean(基本类型) 30 自定义类型的属性是一个对象,这个对象在容器中可能存在 31 32 --> 33 34 35 </beans>
applicationContext03.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 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> 6 7 8 <!--基于XML的自动装配(自定义类型自动赋值) 9 javaBean(基本类型) 10 自定义类型的属性是一个对象,这个对象在容器中可能存在 11 --> 12 <!--id="car" id必须为car 因为private Car car;--> 13 <bean class="com.atguigu.bean.Car" id="car"> 14 <property name="carName" value="宝马"></property> 15 <property name="color" value="白色"></property> 16 </bean> 17 18 <!--<bean class="com.atguigu.bean.Car" id="car02"> 19 <property name="carName" value="宝马"></property> 20 <property name="color" value="白色"></property> 21 </bean>--> 22 23 <!--为Person里面的自定义类型的属性赋值 24 property:手动赋值 25 自动装配:仅对于自定义类型的属性有效 26 自动赋值(自动装配):autowire 27 autowire="default"/autowire="no":不自动装配,不自动为car属性赋值 28 //按照某种规则自动装配 29 autowire="byName":按照名字 30 private Car car 31 以属性名作为id(car)去容器中找到这个组件,给它赋值。如果找不到,就装配null 32 car = ioc.getBean("car") 33 autowire="byType":按照类型 34 private Car car 35 1)以属性的类型作为查找依据去容器中找到这个组件 36 如果容器中有多个这个类型的组件,报错 37 NoUniqueBeanDefinitionException: No qualifying bean of type 'com.atguigu.bean.Car' available 38 expected single matching bean but found 2 39 2)如果没找到,装配null 40 car = ioc.getBean(Car.class) 41 42 autowire="constructor":按照构造器 43 public Person(Car car) 44 1)先按照有参构造器参数的类型进行装配,没有就直接为组件装配null即可 45 2)如果按照类型找到了多个:参数名作为id(car)继续匹配,找到就装配,找不到就null 46 3)不会报错 47 48 --> 49 <bean class="com.atguigu.bean.Person" id="person" autowire="byType"> 50 <!--<property name="car" ref="car"></property>--> 51 </bean> 52 53 <!--List<Books> books:容器可以把容器中所有的book封装list赋值给这个属性--> 54 <bean class="com.atguigu.bean.Book" id="book01"> 55 <property name="bookName" value="图书1"></property> 56 </bean> 57 58 <bean class="com.atguigu.bean.Book" id="book02"> 59 <property name="bookName" value="图书2"></property> 60 </bean> 61 62 <bean class="com.atguigu.bean.Book" id="book03"> 63 <property name="bookName" value="图书3"></property> 64 </bean> 65 66 <!-- 67 [SpEL测试I](Spring Expression Language) 68 在SpEL中使用字面量、 69 引用其他bean、 70 引用其他bean的某个属性值、 71 调用非静态方法 72 调用静态方法、 73 使用运算符 74 --> 75 <bean class="com.atguigu.bean.Person" id="person04"> 76 <!--字面量:${} spring:#{}--> 77 <property name="salary" value="#{12345.67*12}" /> 78 <!--引用其他bean的某个属性值--> 79 <property name="lastName" value="#{book01.bookName}"/> 80 <!--引用其他bean--> 81 <property name="car" value="#{car}"/> 82 <!-- 83 调用静态方法:UUID.randomUUID().toString() 84 #{T(全类名).静态方法名(1,2)} 85 --> 86 <property name="email" value="#{T(java.util.UUID).randomUUID().toString()}"/> 87 <!--调用非静态方法:对象.方法名--> 88 <property name="gender" value="#{book01.getBookName()}"/> 89 <!--或者--> 90 <!--<property name="gender" value="#{book01.bookName}"/>--> 91 92 </bean> 93 </beans>
db.properties:
jdbc.username=root
jdbc.password=root
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/greatshop?serverTimezone=GMT%2B8
jdbc.dirverClass=com.mysql.cj.jdbc.Driver
IOCTest.java:
1 import com.atguigu.bean.Car; 2 import com.atguigu.bean.Person; 3 import org.junit.Test; 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.ConfigurableApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 import javax.sql.DataSource; 9 import java.sql.SQLException; 10 11 /** 12 * @Title: IOCTest 13 * @Description: 14 * @Author: 15 * @Version: 1.0 16 * @create 2020/6/5 22:47 17 */ 18 public class IOCTest { 19 20 // ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml"); 21 ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext03.xml"); 22 23 /** 24 * 单例bean的生命周期 25 * (容器启动)构造器--->初始化方法--->销毁方法 26 * <p> 27 * 多实例: 28 * 获取bean(构造器--->初始化方法)--->容器关闭不会调用bean的销毁方法 29 * 30 * 后置处理器: 31 * (容器启动)构造器-----后置处理器before-----初始化方法-----后置处理器after-----初始化完成 32 * 无论bean是否有初始化方法,后置处理器都会默认其有,还会继续工作 33 */ 34 35 @Test 36 public void test() { 37 System.out.println("容器关闭了..."); 38 ioc.close(); 39 } 40 41 @Test 42 public void test02() { 43 Object book02 = ioc.getBean("book02"); 44 System.out.println("容器关闭了..."); 45 ioc.close(); 46 } 47 48 @Test 49 public void test03() { 50 Object book01 = ioc.getBean("book01"); 51 System.out.println(book01); 52 ioc.close(); 53 } 54 55 @Test 56 public void test04() throws SQLException { 57 //1.从容器中拿到连接池 58 //按照类型获取组件,可以获取到这个类型下的所有实现类子类等等 59 DataSource dataSource = ioc.getBean(DataSource.class); 60 System.out.println(dataSource.getConnection()); 61 } 62 63 //测试username到底是什么 64 @Test 65 public void test05(){ 66 String carName = ioc.getBean("car01", Car.class).getCarName(); 67 System.out.println(carName);//系统用户名 68 } 69 70 //建源码文件夹才会读取配置文件的信息 71 72 // 73 /** 74 * 测试基于xml的自动装配 75 * 容器中只有一个Person,可以直接写类,无需写id 76 */ 77 @Test 78 public void test06(){ 79 Person person = ioc.getBean(Person.class); 80 System.out.println(person); 81 82 } 83 84 @Test 85 public void test07(){ 86 Person person = ioc.getBean("person04",Person.class); 87 System.out.println(person); 88 89 } 90 }