什么是spring?
spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。
为什么使用spring
在不使用spring框架之前,我们的service层中要使用dao层的对象,不得不在service层中new一个对象。
spring的优点
轻量级的容器框架没有侵入性
使用IoC容器更加容易组合对象直接间关系,面向接口编程,降低耦合
Aop可以更加容易的进行功能扩展,遵循ocp开发原则
创建对象默认是单例的,不需要再使用单例模式进行处理
spring的缺点
业务功能依赖spring特有的功能,依赖与spring环境。
Spring设计理念
Spring是面向bean编程
Spring两大核心技术
IOC:控制反转/依赖注入DI
IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
AOP:面向切面编程
已下是一个最基础的spring框架功能
Ioc
![这里写图片描述](https://img-blog.csdn.net/20171002152324080?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZWpsZjAwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!--IOC 通过bean元素声明需要Spring创建的实例。该实例的类型通过class属性指定,并通过id属性为该实例指定一个名称,以便在程序中使用 -->
<bean id="UserName" class="com.pojo.User">
<property name="UserName" value="张三" />
</bean>
<!-- 使用p命名空间注入
记得在顶部导入 xmlns:p="http://www.springframework.org/schema/p"-->
<bean id="userCode" class="com.pojo.User" p:userCode="李四"></bean>
<!-- 通过set注入 -->
<!-- <bean id="daoImpl" class="com.dao.UserDaoImpl"></bean> <bean id="userService"
class="com.service.UserServiceImpl"> <property name="dao" ref="daoImpl"></property>
</bean> -->
<!--构造注入配置 -->
<!-- <bean id="daoImpl" class="com.dao.UserDaoImpl"></bean>
<bean id="userservice2" class="com.service.UserServiceImpl">
<constructor-arg>
<ref bean="daoImpl" />
</constructor-arg>
</bean> -->
<!--使用p配置 set注入 -->
<bean id="daoImpl" class="com.dao.UserDaoImpl"></bean>
<bean id="userservice3" class="com.service.UserServiceImpl"
p:dao-ref="daoImpl">
</bean>
</beans>
测试层Test
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.pojo.User;
import com.service.UserService;
public class UserTest {
@Test
public void show() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//UserName对应application.xml配置文件中的id
User user = (User) context.getBean("UserName");
user.UserName();
User user1 = (User) context.getBean("userCode");
user1.UserCode();
}
@Test
public void getUser() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = new User();
user.setId(1);
user.setUserCode("123");
user.setUserName("张三");
//通过set实现ioc注入
// UserService userService = (UserService) context.getBean("userService");
// userService.getUser(user);
//通过构造函数实现ioc注入
// UserService userService1 = (UserService) context.getBean("userservice2");
// userService1.getUser(user);
//通过p命名空间实现ioc注入
UserService userService3 = (UserService) context.getBean("userservice3");
userService3.getUser(user);
}
}
UserDaoImpl:
package com.dao;
import com.pojo.User;
public class UserDaoImpl implements UserDao{
@Override
public void getUser(User user) {
System.out.println("用户信息"+user);
}
}
UserServiceImpl:
package com.service;
import com.dao.UserDao;
import com.pojo.User;
public class UserServiceImpl implements UserService{
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao dao) {
this.dao = dao;
}
// public UserServiceImpl(UserDao dao) {
// super();
// this.dao = dao;
// }
@Override
public void getUser(User user) {
// TODO Auto-generated method stub
dao.getUser(user);
}
}
配置:set注入和构造注入不要一起用
扩展:
<!--向list添值时-->
<property id="集合名">
<list>
<value>足球</value>
</ list >
</ property >
<!--向数组添值时-->
<property id="数组名">
<list>
<value>足球</value>
</ list >
</ property >
<!--向set添值时-->
<property id="set集合名">
<set>
<value>足球</value>
</set >
</ property >
<!--向map添值时-->
<property id="map集合名">
<map>
<entry>
<key><value>key1</value></key>
<value>value</value>
</entry>
</map >
</ property >
<!--向set添值时-->
<property id="名">
<props>
<prop key=”key1”>value1</ prop>
</ props >
</ property >
<!--赋值为空-->
<property id="名">
<null/>
</ property >
Aop
百度云> 链接:http://pan.baidu.com/s/1o7Q3mx8 密码:pj9h
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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<bean id="logger" class="com.logger.UserLogger"></bean>
<!-- 声明增强方法所在的Bean -->
<bean id="theLogger" class="com.aop.UserServiceLogger"></bean>
<!-- 配置切面 -->
<aop:config>
<!-- 定义切入点 -->
<aop:pointcut id="pointcut"
expression="execution(public void start())" />
<!-- 引用包含增强方法的Bean -->
<aop:aspect ref="theLogger">
<!-- 将before()方法定义为前置增强并引用pointcut切入点 -->
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<!-- 将afterReturning()方法定义为后置增强并引用pointcut切入点 -->
<!-- 通过returning属性指定为名为result的参数注入返回值 -->
<aop:after-returning method="afterReturning"
pointcut-ref="pointcut" returning="result" />
</aop:aspect>
</aop:config>
</beans>
UserServiceLogger:
package com.aop;
public class UserServiceLogger {
private long startDate;
public void before() {
System.out.println("进入前置增强");
startDate = System.currentTimeMillis();
}
public void afterReturning() {
System.out.println("进入后置增强");
long endDate = System.currentTimeMillis();
System.out.println("方法执行的时间"+(endDate-startDate));
}
}
测试类Test:
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.logger.UserLogger;
public class UserTest {
@Test
public void test() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserLogger ulogger = (UserLogger) context.getBean("logger");
ulogger.start();
}
}
提醒
当<aop:config>
报错时-检查头信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
Test调用切面时,以getBean的方式调用,直接用是没效果的
UserLogger ulogger = (UserLogger) context.getBean("logger");