网课笔记
1. 三种装配方式
- 自动装配
- Java装配
- XML装配
1.1. 自动装配
@Autowired { 自动注入 ,可利用直接助于类成员中(利用反射效率低)
(required = false) 忽略当前要注入的bean,如果有直接注入,如果没有跳过。
}
@Component { @Service(服务) @Repository(DAO) @Controller(控制)}
@Configuration { 一般注在配置类 }
@ComponentScan(“com.xxx.xx”){ 包名为扫描范围,一般注在配置类,自动注释中配置类可以为空 }
对于ComponentScan的还有一种解决办法是在applicationContext中添加
<context:component-scan base-package="com.vaxtomis.ssp4"/>
@Qualifier(“”){ 表明需要的类的名称,可以用于解决实现同一接口的多个类在绑定过程中出现冲突的情况。 }
@RunWith(.class){ 运行器,可以指定测试环境(比如指定log4j) }
@Test { 用于标注Junit单元测试中测试方法 }
1.2. Java装配
@ContextConfiguration(classes = .class){ 一般为主要负责配置类,AppConfig.class }
@Bean { 在装配类中标注}
public class UserDaoNormal implements UserDao { @Override public void add() { System.out.println("添加用户到数据库中......"); } }
public class UserServiceNormal implements UserService { private UserDao userDao; public UserServiceNormal() { super(); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void add() { userDao.add(); } }
public class AppConfig { @Bean public UserDao userDaoNormal(){ System.out.println("创建UserDaoNormal对象"); return new UserDaoNormal(); } @Bean //这里使用Qualifier区别 public UserService userServiceNormal(@Qualifier("userDaoNormal") UserDao userDao){ System.out.println("创建UserService对象"); UserServiceNormal userService = new UserServiceNormal(); userService.setUserDao(userDao); return userService; } @Bean public UserDao userDaoCache(){ System.out.println("创建UserDaoCache对象"); return new UserDaoCache(); } }
1.3. XML装配
XML装配较为繁杂,可能贴上一大堆代码以便理解。
首先,要使用xml装配要修改
@ContextConfiguration(“classpath: applicationContext.xml”)
在resource中建立 applicationContext.xml
以下代码结构为
建立Music,CompactDisc,CDPlayer三个类。
Music{String title,int duration}
CompactDisc{String title,String artist,Music[] tracks}
CDPlayer{CompactDisc cd}
实现了get set函数。其中CompactDisc中含有Music类,CompactDisc的play()方法会输出CD的信息和每一首歌的title、duration。
CDPlayer含有CompactDisc,并会调用CompactDisc的play()方法最终对信息进行输出。
贴上.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean id="music1" class="com.vaxtomis.ssp6.Music"> <!--title和duration是属性而不是私有的成员变量 属性和私有成员变量的区别:属性是set方法名中set后的内容的小写名称--> <property name="title" value="告白气球"/> <property name="duration" value="215"/> </bean> <bean id="music2" class="com.vaxtomis.ssp6.Music" p:title="爱情废柴" p:duration="305"/> <!--使用p名称非引用为title(数据类型),引用为title-ref--> <util:list id="trackList"> <ref bean="music1"/> <ref bean="music2"/> </util:list> <bean id="compactDisc1" class="com.vaxtomis.ssp6.CompactDisc" p:title="周杰伦的床边故事" p:artist="周杰伦" p:tracks-ref="trackList"> <!--<property name="title" value="周杰伦的床边故事"/> <property name="artist" value="周杰伦"/>--> <!--<property name="tracks"> <array> <ref bean="music1"/> <ref bean="music2"/> </array> </property>--> </bean> <bean id="CDPlayer1" class="com.vaxtomis.ssp6.CDPlayer"> <property name="cd" ref="compactDisc1"/> </bean> </beans>
<bean>代表需要装配类;id 名称;class 类名;p:title 输入非引用数据类型
p:tittle-ref 输入引用数据类型,需要引入
xmlns:p="http://www.springframework.org/schema/p"
<constructor-arg>装配类中的成员变量,通过构造函数方法注入
<property>装配类中的成员变量,通过setter对应方法注入
<array>数组
<map><entry key=”” value=””></entry></map>图
<set></set>集合
<ref>引用类型

通过上部分的运行结果不难看出,Spring的装载顺序是先按照结构定位到最底层的类,建立实例之后再将底层类注入到上一级类中,最后完成函数调用。
2. 入门
- 初始化Spring容器,无论是否主动获取bean对象,Spring上下文一加载就会创建bean对象。
- 无论注入多少次,拿到的都是同一个对象(单例)
2.1. Bean的作用域
- 单例(Singleton) 只创建一个bean实例
- 原型(Prototype)每次都会创建一个新的bean的实例
- 会话(Session)在Web应用中,为每个会话创建一个bean实例
- 请求(Request)为每个请求创建一个bean实例
scope = “singleton” 情况下:
- 初始化Spring容器,无论是否主动获取bean对象,Spring上下文一加载就会创建bean对象。
- 无论注入多少次,拿到的都是同一个对象
scope = “prototype” 情况下:
- 没有获取对象的情况下,bean的实例不会被创建。
- 只有获取bean对象时,才会创建bean的实例,并且每个实例都不同。
xml装配模式下:
<bean id="notepad" class="com.vaxtomis.test.Notepad" scope="prototype"/>
自动装配模式下:
@Component @Scope("prototype")
Java装配模式下:
@Bean @Scope("prototype")
2.2. 按需加载和积极加载
在scope=”singleton”模式下,Spring的加载策略默认为积极加载。如果想要改成按需加载(即并非在上下文加载时创建对象,而是在有需求时创建)
按需加载的设置
xml装配模式下:
<bean id="notepad" class="com.vaxtomis.test.Notepad" scope="singleton" lazy-init="true"/>
自动装配模式下:
@Component @Scope("singleton") @Lazy
Java装配模式下:
@Bean @Scope("singleton") @Lazy
2.3. 初始化方法和销毁方法
xml装配模式下:
<bean id="notepad2" class="com.vaxtomis.test.Notepad2" scope="singleton" lazy-init="true" init-method="init" destroy-method="destroy"/>
自动装配模式下:
@PostConstruct public void init(){ System.out.println("Notepad2初始化方法......"); } @PreDestroy public void destroy(){ System.out.println("Notepad2销毁方法......"); }
Java装配模式下:
@Bean(initMethod = "init",destroyMethod = "destroy")
特别注意,在JDK大于11版本中,没有自动装配所需的javax.annotation包,需要在pom.xml中添加依赖
<dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.1</version> </dependency>
2.4. 工厂
静态工厂和实例工厂
public class PersonFactory { //静态工厂方法 public static Person createPerson(){ System.out.println("静态工厂创建Person......"); return new Person(); } //实例工厂方法 public Person createPerson2(){ System.out.println("实例工厂创建Person......"); return new Person(); } }
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--静态工厂--> <bean id="person1" class="com.vaxtomis.ssp8.PersonFactory" factory-method="createPerson"/> <!--实例工厂--> <bean id="personFactory" class="com.vaxtomis.ssp8.PersonFactory"/> <bean id="person2" factory-bean="personFactory" factory-method="createPerson2"/> </beans>