笔者自学的框架,知识点来自网上学习教程,方便实惠,推荐,特此声明。
spring
spring中的ioc反向代理
-
ApplicationContext接口(推荐)
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //从spring中获取对象 StudentService studentService = (StudentService) context.getBean("studentService"); studentService.study();
-
BeanFactory
DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(new FileSystemResource("F:\\java\\ssm\\learnspring\\src\\main\\resources\\applicationContext.xml"));
-
bean的三种实例方式
3.1 第一种为默认方法,通过实现bean的接口实现类来实例化<bean id="studentService" class="com.java.service.impl.StudentServiceImpl"/>
3.2 以实例工厂模式返回bean的实现类
<bean id="myFactory" class="com.java.factory.MyBeanFactory"/> <bean id="studentService" factory-bean="myFactory" factory-method="createStudentService"/>
3.3 以静态工厂返回bean的实现类
<bean id="studentService" class="com.java.factory.MyBeanFactory" factory-method="createStudentService"/>
-
bean的生命周期和作用域
4.1 作用域:设定bean的scope属性,有以下几种- singleton: 单态模式。即在一个Spring ioc容器中,使用 singleton 定义的 Bean 是单例的,只有一个实例。默认为单例的。
- prototype: 原型模式。即每次使用 getBean 方法获取的同一个bean的实例都是一个新的实例。
- request:对于每次 HTTP 请求,都将会产生一个不同的 Bean 实例。
- session:对于每个不同的 HTTP session,都将产生一个不同的 Bean 实例。
- application:在一个web应用中会产生一个bean实例,就相当于在一个ServletContext中只有该bean的实例。
- websocket:在一个websocket中会产生一个bean实例。
4.2 bean的初始化和销毁
<bean id="studentService" init-method="init" destroy-method="destroy" class="com.java.service.impl.StudentServiceImpl"/>
4.3bean初始化的前后操作
public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("执行before"); //这里要将bean返回 return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if ("studentService".equals(beanName)) { //创建InvocationHandler对象 InvocationHandler invocationHandler = ((Object p, Method method, Object[] args) -> { //调用study方法时使用动态代理对其进行增强 if ("study".equals(method.getName())) { System.out.println("======目标方法开始======="); //执行目标方法 Object result = method.invoke(bean, args); System.out.println("======目标方法结束======="); return result; } return method.invoke(bean, args); }); //增强bean Object proxy = Proxy.newProxyInstance( bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), invocationHandler ); System.out.println("postProcessAfterInitialization执行"); return proxy;//把增强的代理类返回 } return bean; } }
依赖注入DI
- xml(可通过autowire="byName"属性设置注入方式,黄体部分可修改)
1.1 构造方式
1.2 setter方式<bean id="userService" class="com.monkey1024.service.impl.UserServiceImpl"> <constructor-arg name="userDao" ref="userDaoId"/> </bean> <bean id="userDaoId" class="com.monkey1024.dao.impl.UserDaoImpl"/>
1.3 注入集合<bean id="userService" class="com.monkey1024.service.impl.UserServiceImpl"> <property name="userDao" ref="userDaoId"/> </bean> <bean id="userDaoId" class="com.monkey1024.dao.impl.UserDaoImpl"/>
<!-- Definition for javaCollection --> <bean id="javaCollection" class="com.tutorialspoint.JavaCollection"> <!-- results in a setAddressList(java.util.List) call --> <property name="addressList"> <list> <value>INDIA</value> <value>Pakistan</value> <value>USA</value> <value>USA</value> <