Double 的 Spring
一 Spring介绍
1. 概念
废话的介绍不多说了。
Spring是一种 一站式、轻量级的框架,其有两大核心功能:IOC 和 AOP
1.1 一站式
Spring 可以对 dao、service、web层提供支持。
1.2 轻量级
Spring框架可以更合理的分配资源,使用最小的资源完成当前的需求。
2. 两大核心功能
2.1 IOC 容器
**概念**
IOC 即控制反转,将程序员手动new来创建对象的操作转变为从Spring工厂的IOC容器中获取对象。
也就是将对象的创建权交给(反转给)Spring的IOC容器。
**优点**
1)实现了程序间的解耦
2) 提高了运行效率
3)减小了服务器压力(减少了new的使用)
自定义IOC容器
数据库准备:
(本次先不使用数据库中的数据)
1)创建数据库:
CREATE DATABASE springdb;
2)新建account账户表
create table account(
id int primary key auto_increment,
name varchar(40),
money Double
)character set utf8 collate utf8_general_ci;
3)插入数据
insert into account(name,money) values(‘兔兔’,1000);
insert into account(name,money) values(‘Double’,1000);
insert into account(name,money) values(‘毛毛’,1000);
4)数据库截图
SELECT * FROM account;
项目环境搭建:
1)创建MAVEN工程,导入JAR包坐标
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
2)编写Account类
public class Account {
private Integer id;
private String name;
private Double money;
//Getter and Setter...
//toString()...
}
3)编写DAO接口类 及其 实现类
public interface IAccountDAO {
//储存Account
void save(Account account);
}
public class AccountDAOImpl implements IAccountDAO {
@Override
public void save(Account account) {
//模拟数据库存数据
System.out.println("存储成功" + account);
}
}
3)编写Service接口类 及其实现类
public interface IAccountService {
void saveAccount(Account account);
}
public class AccountServiceImpl implements IAccountService {
@Override
public void saveAccount(Account account) {
/*获取DAO对象第一种方式
*IAccountDAO accountDAO = new AccountDAOImpl();
*业务层调用持久层,此方式耦合性太大,业务层依赖持久层的接口和实现类。若无实现类则无法通过编译,应杜绝这种编译期的依赖关系
*/
/*获取DAO对象第一种方式--利用反射
如果没有实现类也可以编译(不能运行),但全限定类名写死在类中,应避免硬编码。
*/
/*IAccountService accountService =
IAccountService) Class.forName("com.tutu.dao.impl.AccountDAOImpl").newInstance();
*/
/*利用工厂模式,使用配置文件,创建BeanFactory类,提供获取对象的工厂,bean.xml配置文件*/
BeanFactory factory = new BeanFactory();
IAccountDAO accountDAO = (IAccountDAO) factory.getBean("accountDAO");
accountDAO.save(account);
}
}
4)bean.xml
<beans>
<!--DAO对象-->
<bean id="accountDAO" class="com.tutu.dao.impl.AccountDAOImpl"></bean>
<!--Service对象-->
<bean id="accountService" class="com.tutu.service.impl.AccountServiceImpl"></bean>
</beans>
5) BeanFactory类
public class BeanFactory {
private static Map<String, Object> map = new HashMap<>();
//随字节码的加载,先根据配置文件提前把需要的对象都创建出来(单例的),需要用的时候再取出。
static {
//将bean.xml变成流
InputStream is=
BeanFactory.class.getClassLoader().getResourceAsStream("bean.xml");
SAXReader sr = new SAXReader();
//存入的对象
Object obj = null;
Document document = null;
try {
//将配置文件转换为文档
document = sr.read(is);
//获得根结点
Element rootElement = document.getRootElement();
//获取根结点下所有的bean元素
List<Element> elements = rootElement.elements("bean");
for (Element element : elements) {
//获取对象名
String id = element.attributeValue("id");
//获取实现类全限定类名
String clazz = element.attributeValue("class");
//创建对象
obj = Class.forName(clazz).newInstance();
//存入map集合
map.put(id, obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public Object getBean(String bean) throws Exception {
return map.get(bean);
}
}
6)测试类
public class Demo {
@Test
public void testDemo01() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Account account = new Account();
account.setId(1);
account.setName("兔兔");
account.setMoney(1000d);
//创建service对象同dao
BeanFactory factory = new BeanFactory();
IAccountService accountService =
(IAccountService)factory.getBean("accountService");
accountService.saveAccount(account);
}
}
7)测试结果
2.2 AOP
请见下一遍文章
:
排版好困难。。编辑器怎么用呀。。
如有错误,请指出,不胜感激!