网课笔记
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>