JAVASSM
day1-spring&ioc
框架:web层+service层+dao层
ssh:Struts2(有安全漏洞,已弃用)+Spring+Hibernate(不够灵活)
ssm:SpringMVC+Spring+MyBatis
两方面:
ioc控制反转(di依赖注入)
aop面向切面编程
ioc控制反转的配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<p:beans xmlns:p="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-3.2.xsd ">
</p:beans>
ioc控制反转获取对象的方式:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = (Person) context.getBean("person");
常用的设计模式共有23种
多例:scope="prototype"
懒加载:lazy-init="true"
全局懒加载:default-lazy-init="true"
多例情况下不需要配置懒加载
创建:init-method="init"
销毁:destroy-method="destroy"
List/Set/Map/Properties(映射)(key和value都为String的映射,可以保存在文件中)
autowire自动装载:byName/byType
全局自动装配:default-autowire="byName"
di依赖注入
day2-annotation
javap:反编译
注释:给人看的提示信息,人看了提示信息了解程序的内容
注解:给程序看的提示信息,程序看后可以根据有无注解及注解上属性的不同配置执行不同的逻辑。
注解中只有一个value的时候,可以省略等号及等号前的部分
only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof
元注解:给注解注解的注解
四个元注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
RetentionPolicy.SOURCE:此注解会被保留到源码阶段,.java中,在编译过程中被删除。
这种类型的注解通常是给编译器看的。
RetentionPolicy.CLASS:此注解将会被保留在源码阶段 和 编译阶段 ,.java和.class中,在类加载的过程中被删除。
这种类型的注解通常是给类加载器看的。
RetentionPolicy.RUNTIME:此注解将会被保留在源码阶段 、编译阶段 和 运行阶段,.java .class和内存中的字节码中都会存在。
这种类型的注解通常用来在运行阶段进行反射,控制程序运行过程。
**只有RUNTIME级别的注解才可以通过反射技术进行反射。
@Documented是否被提取到文档中
@Inherited表示被注解类的子类也会被注解
反射注解:
isAnnotationPresent(annotationClass);
getAnnotation(annotationClass);
getAnnotations();
spring注解的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.2.xsd
">
</beans>
注解开启包扫描:<context:component-scan base-package="cn.tedu.domain"></context:component-scan>
@Component注解:如果首字母是大写,并且第二个字母不是大写,那么默认会将首字母转换为小写作为类(bean)的id。如果第二个字母是大写,那么会按照类名作为类(bean)的id。
@Component("abc")注解:可以强制性指定id
开启注解方式配置di:<context:annotation-config></context:annotation-config>
注解使用文件保存信息:<context:property-placeholder location="classpath:/data.properties" />
@Autowired自动装配注解:先按id找,再按类型找,如果都不存在则报异常。如果属性是一个接口,那么会先找bean id,如果找不到会根据属性类型寻找,会去寻找接口的实现类,
@Qualifier("dogx")强制指定id(spring提供)
@Resource(name="dogx")也可以强制指定id(java提供)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)单例和多例
@Lazy单例时会用到懒加载
@PostConstruct加载方法
@PreDestroy销毁方法
四个相同的注解:
@Component通用的注解
@Controller控制层web层
@Service业务层service层
@Repository数据层dao层
无论使用什么技术实现dao层,对于service层来说调用的方法是一样的
day3-proxy
Golang语言:没有对象,协程,天然支持高并发
代理解决的问题:
1.减少代码的重复
2.将功能性代码和业务逻辑代码分开
两者都可以实现,但不符合设计初衷:
重写主要应用于子类覆盖父类的方法
装饰者设计模式主要用于对原有的类添加方法进行增强,而不是直接修改原来的代码
静态代理:手动创建代理者,解决了将功能性代码和业务逻辑代码分开的问题
动态代理:自动创建代理者,解决了两个问题
两种方法都可以获取到类kk.getClass()=CXK.class
jdk内置代理:
Proxy.newProxyInstance
java的动态代理是通过代理者实现和被代理者相同的接口来保证两者具有相同的方法的,如果被代理者想要被代理的方法不属于任何接口,则生成的代理者自然无法具有这个方法,也就无法实现对该方法的代理。所以java的动态代理机制是基于接口进行的,受制于要代理的方法是否有接口的支持。
cglib:
Enhancer en = new Enhancer();
en.setSuperclass(us.getClass());
en.setCallback(new MethodInterceptor() {});
优点:无论是否有接口都可以实现动态代理,使用场景基本不受限
缺点:第三方提供的动态代理机制,不是原生的,需要导入第三方开发包才可以使用
day4-aop
父类private修饰的也可以被继承,但是无法被调用
切入点表达式:
粗粒度表达式:within(cn.tedu.service.UserServiceImpl)
细粒度表达式:execution(void vn.tedu.service.UserServiceImpl.registUser(cn.tedu.domain.User))
service包下全部拦截:execution(* cn.tedu.service..*(..))
通知顺序会被xml中配置的顺序所影响
当有多个切面(aspect)时,以责任链模式执行(ABCXCBA)
五种通知类型:before、around、after-returning、after-throwing、after
前置通知:记录日志(方法将被调用)
环绕通知:控制事务和权限控制
后置通知:记录日志(方法已经成功调用)
异常通知:异常处理和控制事务
最终通知:记录日志(方法已经调用,但不一定成功)
spring自动为目标对象生成代理对象,默认情况下,如果目标对象实现过接口,则采用java的动态代理机制,如果目标对象没有实现过接口,则采用cglib动态代理。开发者可以可以在spring中进行配置,要求无论目标对象是否实现过接口,都强制使用cglib动态代理。
通用切入点:其他的调用mm()即可
@Pointcut("execution(* cn.tedu.service.*.*(..))")
public void mm() {}
转换成list:Arrays.asList(privs)
把调用接口转成调用实现类:
MethodSignature ms = (MethodSignature) pjp.getSignature();
// 获取的默认是接口的方法,需要获取的是实际运行时调用的方法
Method method = ms.getMethod();
// 获取目标对象
Object targetObj = pjp.getTarget();
// 获取实际调用的方法
Method instanceMethod = targetObj.getClass().getMethod(method.getName(), method.getParameterTypes());
day5-threadlocal&springjdbc
编译时是Object,运行时是String:
Object o="abc";
System.out.println(o);
编译时是接口,运行时注入变成实现类:
@Autowired
private IUserService ius;
进程:正在内存中执行的程序
线程:进程的一个单元,在代码调用方法时执行
线程并没有真正提高代码的执行效率,但是提高了利用率
造成线程安全隐患三个条件:有多条线程,有共享资源,有写操作时,去掉三者之一就可以避免线程安全隐患
有多条线程:通过加锁(Lock)(synchronized)解决
有共享资源:通过本地线程变量(ThreadLocal)解决
有写操作时:以线程通信来共享资源(新思想),以共享资源来通信(旧思想)
jdbc:java操作关系型数据库的api
c3p0:jdbc每次都要创建关闭连接,很消耗资源,所以引入了c3p0连接池
xml配置方式:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql//10.8.24.191/mydb2</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
本文深入探讨了SSM(SpringMVC+Spring+MyBatis)框架的原理与应用,包括IoC控制反转、AOP面向切面编程、注解配置、动态代理与AOP实现等内容,为读者提供了全面的SSM框架学习指南。
167

被折叠的 条评论
为什么被折叠?



