基本概念
IoC(Inversion of Control)控制反转
定义:使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
IoC容器
定义:spring中使用IoC容器实现IoC
IoC容器负责对象的创建、初始化等一系列工作。
Bean
被创建或被管理的对象在IoC容器中统称为Bean
DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
代码样例
业务层代码
BookService
public interface BookService {
public void save();
}
BookServiceImpl
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
System.out.println("book service save...");
bookDao.save();
}
}
数据层实现
BookDao
public interface BookDao {
void save();
}
BookDaoImpl
public class BookDaoImpl implements BookDao {
public void save(){
System.out.println("book dao save ...")
}
}
Application
public class Application {
public static void main(String[] args) {
BookService bookService = new BookServiceImpl();
bookService.save();
}
}
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
applicationContext.xml
<?xml version="1.0"encoding="UTF-8"?>
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
IoC使用案例
定义类和接口
BookService
public interface BookService {
public void save();
}
BookServiceImpl
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
System.out.println("book service save...");
bookDao.save();
}
}
创建配置文件,配置bean
<bean id="bookService"class="com.itheima.service.impl.BookServiceImpl"/>
初始化容器
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
DI使用案例
删除new
提供setter方法
BookServiceImpl
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save...");
bookDao.save();
}
}
配置service与dao绑定关系
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
Bean属性
id:标签
name:别名
class:bean类型
scope:是否是单例
init-method:bean初始化对应的操作
destory-method:bean销毁前对应的操作
autowire:自动装配
Bean实例化
spring创造bean调用无参构造方法。
使用静态工厂实例化bean
添加工厂
public class BookDaoFactory {
public static BookDao getBookDao() {
return new BookDaoImpl();
}
}
设置bean
<bean id="bookDao" class="com.itheima.factory.BookDaoFactory" factory-method="getBookDao"/>
实例工厂实例化bean
添加工厂
public class BookDaoFactory {
public BookDao getBookDao() {
return new BookDaoImpl();
}
}
设置bean
<bean id="bookDaoFactory" class="com.itheima.factory.BookDaoFactory"/>
<bean id="bookDao" factory-method="getBookDao" factory-bean="bookDaoFactory"/>
使用FactoryBean实例化bean
添加工厂
public class BookDaoFactoryBean implements FactoryBean<BookDao> {
@Override
public BookDao getObject() throws Exception {
return new BookDaoImpl();
}
@Override
public Class<?> getObjectType() {
return BookDao.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
设置bean
<bean id="bookDao" class="com.itheima.factory.BookDaoFactoryBean"/>
通过接口控制bean生命周期
添加接口,代替init-method,destory-method
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save...");
bookDao.save();
}
@Override
public void destroy() throws Exception {
}
@Override
public void afterPropertiesSet() throws Exception {
}
}
依赖注入
setter注入
上文提到过引用类型注入
简单类型注入的bean
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="databaseName" value="mysql"/>
</bean>
构造器注入
提供构造方法
注入bean
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
</bean>
还有按类注入,按位置注入
集合注入
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<property name="list">
<list>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
</list>
</property>
<property name="set">
<set>
<value>itcast</value>
<value>itheima</value>
<value>boxuegu</value>
<value>boxuegu</value>
</set>
</property>
<property name="map">
<map>
<entry key=""value=""/>
<entry key=""value=""/>
<entry key=""value=""/>
</map>
</property>
</bean>
Bean纯注解开发
定义配置类
@Configuration
@ComponentScan("com.itheima.dao")
public class SpringConfig {
}
定义类(注解,四个任选其一)
@Component("bookDao")
//@Controller:用于表现层bean定义
//@Service:用于业务层bean定义
//@Repository:用于数据层bean定义
@Scope("prototype")//单例或非单例
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
BookServiceImpl
@Service("bookService")
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
@Value("itheima")
private String name;
public void save() {
System.out.println("book service save...");
bookDao.save();
}
@PreDestroy
public void destroy() {
System.out.println("BookService destroy");
}
@PostConstruct
public void afterPropertiesSet() {
System.out.println("BookService init");
}
}
使用类
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
bookDao.save();
}
}
加载外部properties文件
定义配置类
@Configuration
@ComponentScan("com.itheima")
@PropertySource("jdbc.properties")
public class SpringConfig {
}
定义类
@Service("bookService")
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
@Value("${name}")
private String name;
public void save() {
System.out.println("book service save..." + name);
bookDao.save();
}
}
❤️ 转载文章请注明出处,谢谢!❤️