1、环境搭建
a)只用IOC功能
spring.jar、jarkata-commons.jar/commons-loggin.jar
2、IOC容器
A)实例化具体bean
B)动态装配
3、AOP支持
A)安全检查
B)事务管理
4、Spring IOC配置与应用
1、FAQ:不给提示
A)window-preferences-myeclipse-xml-xml catalog
B) User spefied Entries -add
i、Location:.../spring2.5.6/dist\resources\spring-beans-2.5.xsd
ii、 URI:
file:/spring2.5.6/dist\resources\spring-beans-2.5.xsd
iii、 key type: schema Location
iv、 Key
http://www.springframework.org/schema/beans 这个是些配置文件XML中的头信息
2、注入类型
A) setter方法注入
B) 构造方法的注入
C) 接口注入(也称方法注入)
3、id vs name
A)Spring_0400_IOC_id_Name 这个是测试项目的实例 下面同此
B) name与ID没有什么区别只是name 可以用特殊的字符如_等
4、简单属性的注入
A) Spring_0500_IOC_SimpleProperty
B) <property name=... value=....>
5、bean中属性的范围scope
A) Spring_0600_IOC_Bean_Scope
B) singleton 单列
C) proptotype 每次都创建新的对象原型,还有与web 相关的属性,但是都会提示
6、集合注入
A) Spring_0700_IOC_Collections
B) 很少用 但是不理解,参考文档
7、自动装配
A) Spring_0800_IOC_AutoWire
B) autowire="byName"/"byType"
C) 如果所有的bean都用同一种,可以使用beans的属性:default-autowire
8、生命周期
A) lazy-init(不重要)
B) init-method destory-method 不要和scope="prototype"一起使用,这个相当在方法的前面和后 面加入日志,自己写的bean很少用但是别人提供的会使用,如datasource连接池
9、Annotation 第一步:
A) 修改XML文件,参考文档<context: annotation-config />
怎样在Java代码中有自动提示功能:如加入@就有提示
在window-preferences-Java-Editor-content Assist即可
这边要有其功能也要配置schame模式的路径,具体方法参见4中FAQ
10、 如果自动注入的方法有两个bean注入,系统无法知道注入那个bean,所以就要
@Autowired
public void setUserDAO(@Qualifier("u这个是在配置文件中bean的命名") UserDAO userDao){}
应用的不是很多
11、在使用@Resource(一般常用的)
A) 必须在j2EE中加入common-annoations.jar
B) 默认是按照名称:名称找不到,按类型
C) 可以指定特定的类型如:
@Resource(name="u")
public void setUserDAO(UserDAO userDao){}
D) 但是如果手中没有源码,就可以在XML文件中配置,这个第2中方式
12、使用@Component,@Service,@Controller,@Repository作用都是一样,看以后的版本是否有扩充
A>要在XML文件中beans标签中加入
<context:component-scan base-package="要在自己哪个包中注入的bean如:com.hewen">
就会在com.hewen包下扫描所有的类,直到发现有类加入@component.
然后 @Resource
public void setUserDAO(UserDAO userDao){}此方法就会注入有@component类中,
但是如果有多个类加入了@component的组件,就要为组件命名如:@component("u")
要注入的方法前面加入@Resource(name="u"),这样的好处就不需要在配置文件中写bean来配置类,
一般情况下记得要写名字如:@component("userService")
B) 开发效率高
13、@scope与写在bean写XML中的scope一样,
@PostConstruct=init-method; @PreDestory=destory-method
注意以上13条忘记可以参见自己的源码或者查看文档
五、 AOP的概念
面向切面编程,某个模块可有可无可以在配置文件进行处理
动态代理的应用:事务管理、做日志、做权限管理、效率的检查
别如说过滤器
1、配置新的配置文件:
首先要加<aop:aspectj-autoproxy />
然后加入 xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
如果需要在写的时候需要提示:则需要在myeclipse进行配置,详细操作见Spring IOC配置与应用
FAQ:不给提示.
2、<aop:aspectj-autoproxy />aspectj是专门装配动态代理的框架,是一个面向切面的框架
3、如需要装配动态代理的标签就需要加入两个Jar文件,分别为aspectjtr.jar、aspectjweaver.jar
4、常见的Annotation:
可以代理构造方法、属性、异常等等详细的配置可以查看文档
A) JoinPoint 是连接点如:
@Before("execution(public void com.bjsxt.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))")
public void before(){
System.out.println("method start");
}
在此类上要加入 @Aspect和@Component
B)Pointcut 相当于JoinPoint的集合如:
@Pointcut("execution(public * com.bjsxt.service..*.add(..))") com.bjsxt.service在命名空间下所有add的方法 都进行动态代理
C)Before
D)AfterReturning
E)AfterThrowing
F)After
G)Around 类似于dofilter
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public ObjectdoBasicProfiling(ProceedingJoinPointpjp) throws Throwable{
//startstopwatch
ObjectretVal=pjp.proceed();要调用此函数方法才能往下调用,相当于模式的责任链
//stopstopwatch
return retVal;
}
如果方法前后命名空间重复就可以这么定义:
@Pointcut("execution(public * com.bjsxt.dao..*.*(..))")
public void myMethod(){};
@Before("myMethod()")
public void before(){
System.out.println("method before");
};
@AfterReturning("myMethod()")
public void afterMethod(){
System.out.println("method after");
};
5、当程序报异常无法加载动态代理类,出现GBL什么之类的故需要jar文件,
因为一个类需要进行代理的时候,必须实现InvocationHandler接口,就会利用JDK动态代理获取代理类,
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();//该类实现了InvocationHandler接口
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);//获取代理类,第一个参数获取被代理类的类加载器,第二个参数是被代理类的实现的接口,第三个参数是处理被代理类的类既是实现InvocationHandler接口
System.out.println(userDAOProxy.getClass());//可以进行测试是否得到代理对象
userDAOProxy.delete();
userDAOProxy.save(new User());
如果没有实现此接口,那么实行2进制码的类库进行代理,需要加入jar文件cglib-nodep.jar