Public class UserServiceImple implements UserService{
//实例化对象
private UserDAO userDao = new UserDAOImpl();
}
步骤1:删除new关键字创建对象,声明属性和创建属性的setter方法
Public class UserServiceImple implements UserService{
//声明属性
private UserDAO userDAO;
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
步骤:2:配置xml文件
<bean id="userDAO" class="com.wb.springdemo.dao.impl.UserDAOImpl“/>
只需要配置xml文件中的bean示例:**
配置xml文件示例:
<bean id ="carFactory" class="com.wb.springdemo.factory.CarFactory" />
<bean id ="car" factory-method="createCar" factory-bean="carFactory">< /bean>
步骤1:创建一个学生工厂类StudentFactory实现FactoryBean接口,实现接口中的方法,示例如下:
public class StudentFactory implements FactoryBean< Student > {
public Student getObject() throws Exception {
return new Student();
}
public Class<?> getObjectType() {
return Student.class;
}
}
步骤2:配置xml文件
<bean id ="student" class="com.wb.springdemo.factory.StudentFactory" />
步骤1:声明属性和创建属性的setter方法
Public class UserServiceImple implements UserService{
//声明属性
private UserDAO userDAO;
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
步骤:2:配置xml文件
<bean id="userDAO" class="com.wb.springdemo.dao.impl.UserDAOImpl“/>
步骤1:声明属性和创建对应属性的构造方法
Public class UserServiceImple implements UserService{
//声明属性
private UserDAO userDAO;
//声明基本数据类型
private int age;
//声明数组类型
private List<String> data;
//对应属性的构造方法
public UserServiceImpl(UserDAO userDAO, int age, List<String> data) {
this.userDAO = userDAO;
this.age = age;
this.data = data;
}
步骤2:配置xml文件
<bean id="userService" class="com.wb.springdemo.service.impl.UserServiceImpl">
<!-- 构造器注入 -->
<constructor-arg name="userDAO" ref="userDAO"></constructor-arg>
<constructor-arg name="age" value="18"/>
<constructor-arg name="data">
<list>
<value>controller</value>
<value>dao</value>
<value>service</value>
</list>
</constructor-arg>
</bean>
bean标签的scope属性用于表示作用域范围
scope属性的取值:(默认取值单例scope="singleton”)
prototype 多例对象–>每创建一个对象创建一个新的实例
singleton 单例对象–>一个bean的定义,只有一个实例。不是一个类只有一个实例。
request 一个请求一个实例
session 一个会话一个实例
websocket 一次websocket链接一个实例
单例对象:
初始化:Spring容器创建时对象初始化
生存期:只要容器还在,对象就存在
销毁期:容器销毁,对象就销毁
总结:单例对象的生命周期和Spring容器的生命周期想相同
多例对象:
初始化:当我们使用对象时Spring容器才为我们创建对象
生存期:对象只要是在使用过程中就一直存在
销毁期:当对象长时间不使用时,且没有别的对象引用时,由java的垃圾回收器回收。
方式1:在类中自定义两个方法来实现,表示开始和结束
步骤1:自定义开始和结束的方法
Public class UserServiceImple implements UserService{
//自定义开始方法
public void beanStart(){
System.out.println("...bean开始了...");
}
//自定义结束方法
public void beanEnd(){
System.out.println("...bean结束了...");
}
}
步骤2:配置xml中对应bean的init-method和destroy-method
<bean id="userService" init-method="beanStart" destroy-method="beanEnd" class="com.wb.spring.service.impl.UserServiceImpl">
</bean>
步骤3:创建main方法验证bean的生命周期
public static void main(String[] args) {
//创建Spring容器对象ac
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("aplicationContext.xml");
userService userService= ac.getBean("userService", UserService.class);
//销毁ac容器对象
ac.close();
}
方式2:只需要类实现InitializingBean接口和DisposableBean接口即可。
public class Cycle implements InitializingBean, DisposableBean {
//bean开始的方法
public void afterPropertiesSet() throws Exception {
System.out.println("开始。。。");
}
//bean结束的方法
public void destroy() throws Exception {
System.out.println("结束。。。");
}
}
全称是Aspect Oriented Programming,即面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
步骤1:在pom.xml文件中导入依赖包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
步骤2:编写Service类
public class UserServiceImpl implements UserService {
@Override
public void addUser(User user) {
System.out.println("添加User成功!");
}
public void addTest(){
System.out.println("测试add方法");
}
}
步骤3:编写通知,实现MethodBeforeAdvice接口
public class AdviceDemo implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("方法:"+method+"参数:"+ Arrays.toString(args)+"目标对象:"+target);
}
}
步骤4:配置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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置目标对象 -->
<bean id="userService" class="com.wb.springaop.service.impl.UserServiceImpl"/>
<!-- 配置通知-->
<bean id="adviceDemo" class="com.wb.springaop.compent.AdviceDemo"/>
<!-- 配置切入点 -->
<bean id="pointCut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="com.wb.springaop.service.impl.UserServiceImpl.add.*"></property>
</bean>
<!-- 配置切面 -->
<bean id="aspect" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<!-- 组装通知 --> <property name="advice" ref="adviceDemo"/>
<!-- 组装切入点 --> <property name="pointcut" ref="pointCut"/>
</bean>
<!-- 包装Service类 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
</beans>
步骤1:同方式1,在pom.xml文件中导入依赖包
步骤2:编写service类并注解
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public void addUser(User user) {
System.out.println("添加User成功!");
}
public void addTest(){
System.out.println("测试add方法");
}
}
步骤3:编写切面类
@Component
@Aspect
public class TxAdvice {
//编写切入点
@Pointcut("execution(* com.wb.springaop.service.impl.*.* (..))")
public void servicePointcut(){}
//编写通知
@Around("servicePointcut()")
public Object invokeMethod(ProceedingJoinPoint pjp) {
//参数
Object result = null;
Object[] args = pjp.getArgs();
try {
System.out.println("...开启事务...");
result = pjp.proceed(args);
System.out.println("...提交事务...");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("...回滚事务...");
}
return result;
}
}
步骤4:编写JAVA配置文件类
@Configuration
@ComponentScan("com.wb.springaop")
@EnableAspectJAutoProxy
public class AopConfig {
}
步骤5:编写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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置扫描的包-->
<context:component-scan base-package="com.wb.springaop"/>
<!--启动aspectj自动生成代理类-->
<aop:aspectj-autoproxy/>
</beans>