1.面向接口(抽象)编程的概念与好处(属于Spring的特性)
好处:灵活,解耦
Service(业务逻辑层)
Dao(数据库访问层,屏蔽不同数据库的访问,接口类,不同的实现类可以注入)
Bean(实体类)
2.Spring 的两个特性
IOC/DI
Inversion of control(控制反转)
对象的创建,由Spring容器读取配置文件进行自动创建,而非自己写代码来进行创建。
dependency injection(依赖注入)
将对象的依赖,通过spring容器读取配置文件进行创建并注入。
Spring的作用
1.实例化具体bean
2.动态装配
3.如何创建user library?
Windwos -> preferences -> User Libraries -> New
Windwos -> preferences -> User Libraries -> Add JARs
4.Spring配置文件
<beans ... default-autowire="byName" default-lazy-init="true">
<bean id="u" class="com.anker.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.anker.service.UserService">
<property name="userDAO" bean="u"/>
</bean>
</beans>
property属性是在Bean对象实例化后,才注入的。
default-autowire
自动装配:(指bean中的引用对象,自动在配置文件中寻找相同名字或者类型的bean进行注入)
包含两种:
byType 根据类型进行自动匹配
byName 根据名字自动匹配
default-lazy-init(默认为false)
Bean的生命周期:(每次类ClassPathXmlApplicationContext新建时,会自动创建所有的bean对象)
当设置为true,即意味着不自动创建bean对象, 当有用到此bean时,调用getBean方法时,才会创建
Scope
用于设置Bean的创建方式:
singleton:(单例,默认为单例)
prototype:(每次创建新对象)
property标签
用于设置注入bean对象中的引用对象
bean中可以设置(不常用)
init-method(初始化Bean时执行的方法,bean创建后执行的方法)
destroy-method (在Bean被销毁的时候,调用的方法。执行context.registerShutdownHook方法时会执行此指定的方法)。
initializingBean DisposableBean接口
当Bean类实现initializingBean接口,在bean被初始化时,spring容器自动调用afterPropertiesSet方法
在Bean类实现DisposableBean接口,在bean被摧毁时,Spring自动调用destroy方法。
作用,跟上面的xml文件配置是一样的。
afterPropertiesSet方法是在对象创建后调用的。
5.spring集合注入:
<bean>
<property name="sets">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
<property name="lists">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="maps">
<map>
<entry key="1" value="1"></entry>
<entry key="2" value="2"></entry>
<entry key="3" value="3"></entry>
</map>
</property>
</bean>
6.FactoryBean
针对对象的创建过程比较复杂,采用工厂类来创建。
在Spring中,只要类实现了FactoryBean接口,即为Bean工厂类,它实际上返回的对象为getObject()方法的返回。
通过工厂类,可以灵活的控制对象的初始化过程,根据不同情况创建不同的对象。
public UserManager getObject() throws Exception {
System.out.println("create UserManager region="+region);//创建其他对象前,可以提前获取前置条件的输入参数值
UserManager re= new UserManager();
if(region.equal("1"))
re.setUserDao(userDao)
else{
re.setUserDao(userDao2);
};
System.out.println(this.region);
return re;
}
7.PlaceHolder 占位符
占位符,将某些参数存放在配置文件中,然后读取配置文件进行获取。这样减少更改源代码的机会。
配置的方法:<context:property placeholder location="xxxx/conf.properties">
${region},当遇到此类占位符,将从配置的文件中寻找key为region的键值对,并将赋值。
8. BeanFactoryPostProcessor Bean类总工厂的后置处理器
Bean工厂的后置处理器,指在通过xml文件配置Bean之后,对Bean的创建方法可以进行修改、重新定义。(比如占位符的替换,其实就是后置处理器在起作用)。ye3w
需要继承BeanFactoryPostProcessor接口,然后在XML中像配置普通的Bean一样进行配置即可。
继承PriorityOrdered,指定权限数字,用于当多个Bean工程类总工厂执行的顺序
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bd = beanFactory.getBeanDefinition("userManager"); //获取bean的定义
MutablePropertyValues pv = bd.getPropertyValues();
String oldValue = ((TypedStringValue) pv.getPropertyValue("region").getValue()).getValue();
Object obj;
if ("hz".equals(oldValue)) { //根据设置的参数,注入不同的Dao对象
obj = beanFactory.getBean("userDao1");
} else {
obj = beanFactory.getBean("userDao2"); //getBean时创建Bean对象
}
String newRegion = "{" + oldValue + "}";
pv.addPropertyValue("region", newRegion); //增加注入参数值
pv.addPropertyValue("userDao", obj); //增加注入对象
}
9.BeanPostProcessor Bean接口切面
此接口可以实现对对象进行重新包装返回,比如对传递过来的类进行返回它的子类等。
类实现接口BeanPostProcessor即可,然后在xml文件中配置,既可以实现在Bean初始化方法前后进行添加内容。
此接口存在两个方法,Object postProcessBeforeInitialization(Object bean,String beanName)(第一个参数为实例化类的object,)
在类init-method方法之前,被调用,此时类已执行初始化方法。
Object postProcessAfterInitialization(Object bean,String beanName)
在类初始化之后,被调用。
10.AOP:
面向切面编程,是面向对象的思维方式的有力补充。
好处:可以动态的添加和删除切面上的逻辑而不影响原来的代码。
11.如何调整Tomcat的内存设置
Tomcat的启动参数位于tomcat目录\bin,windows系统为catalina.bat文件
linux系统改为catalina.sh
windows添加内容:
set JAVA_OPTS= -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M
-server: tomcat默认以-client模式启动,-server意味着更好的性能
-Xms:JVM堆内存初始值
-Xmx:JVM堆内存最大值
-Xmn:JVM堆内存最小值
-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64(内存4GB,4*1024/64 = 64MB)
-XX:MaxPermSize设置最大非堆内存的大小 默认是物理内存的1/4。
在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。
Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。
堆是在 Java 虚拟机启动时创建的。
在JVM中堆之外的内存称为非堆内存(Non-heap memory)。
非堆就是JVM留给自己用的,
方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、
每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
12.web项目中,如何利用spring自动初始化bean对象
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
默认的路径是"/WEB-INF/applicationContext.xml,
如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/DefaultContext.xml</param-value>
</context-param>
13.eache缓存框架的使用
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
使用指定配置文件创建
CacheManager manager = CacheManager.create("src/config/ehcache.xml");
取得配置文件中预先 定义的sampleCache1设置,生成一个Cache
Cache cache = manager.getCache("sampleCache1");
删除cache
CacheManager singletonManager = CacheManager.create();
singletonManager.removeCache("sampleCache1");
3.使用Caches
(1)往cache中加入元素
Element element = new Element("key1", "value1");
cache.put(new Element(element);
(2)从cache中取得元素
Element element = cache.get("key1");
(3)从cache中删除元素
Cache cache = manager.getCache("sampleCache1");
Element element = new Element("key1", "value1");
cache.remove("key1");
3.卸载CacheManager ,
关闭Cache manager.shutdown();
所以大概步骤为:
第一步:生成CacheManager对象
第二步:生成Cache对象
第三步:向Cache对象里添加由key,value组成的键值对的Element元素
ehcache.xml是ehcache的配置文件,并且存放在应用的classpath中。
下面是对该XML文件中的一些元素及其属性的相关说明:
<diskStore>元素:指定一个文件目录,
当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下。
<defaultCache> : 默认cache
maxElementsInMemory: 缓存对象的最大数
eternal: 如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false;
timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,超过这个时间,EHCache即把它从内存中清除。
timeToLiveSeconds: 设定允许对象存在于缓存中的最长时间。
overflowToDisk: 如果为true,表示当基于内存的缓存中的对象数目达到了 maxElementsInMemory界限后,
会把益出的对象写到基于硬盘的缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。