本篇文章是我的SSM框架入门笔记,笔记内容基于黑马程序员的课程内容:点击打开
Spring是分层的Java SE、EE 应用的全栈轻量级开源框架,以IoC(inverse Of Control:控制反转)和AOP(Aspect OrientedProgramming:面向切面编程)为内核。
提供了视图层SpringMVC、持久层Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐称为使用最多的Java EE企业应用开源框架。
这句话视频里抄下来的,我现在还不懂这是什么意思。
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring惊醒控制,避免硬编码所造成的过度耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层应用。
通过Spring的AOP功能,方便进行面向切面编程,许多不容易用创痛OOP实现的功能都可以通过AOP实现。
这个听抽象的,我的水平还不够去理解!
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
Spring对各种优秀框架(Struts、Hibernate、Hessian、Quartz)的支持。
Spring对JavaEE API(如JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些API的使用难度大为降低。
简单对比一下 javaweb 和 spring 的用法。
导入Spring开发包
//pom.xml文件org.springframework spring-context 5.0.5.RELEASE
Spring ├─.idea │ └─spring_ioc │ pom.xml │ spring_ioc.iml │ └─src ├─main │ ├─java │ └─resources └─test └─java
上面个是项目的基本结构,下面的相关代码,按顺序操作。
//pom.xmlorg.springframework spring-context 5.0.5.RELEASE junit junit 4.12 test
//UserDao.java package com.nothinglin.dao; public interface UserDao { public void save(); }
//UserDaoImpl.java package com.nothinglin.dao.impl; import com.nothinglin.dao.UserDao; public class UserDaoImpl implements UserDao { //这里没写,实际有一个无参构造器 public void save(){ System.out.println("save running..."); } }
//applicationContext.xml
//firstSpringTest.java public class firstSpring { public static void main(String[] args) { //加载Spring配置文件 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取Spring容器中对应id下的内容 UserDao userDao = (UserDao)app.getBean("userDao"); //调用目标对象的方法 userDao.save(); } }
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
scope:指对象的作用范围(singleton、prototype、request、session、global session)
singleton和prototype之间的区别:
singleton:
//applicationContext.xml
public class firstSpring { public static void main(String[] args) { //加载Spring配置文件 ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取Spring容器中对应id下的内容 UserDao userDao1 = (UserDao)app.getBean("userDao"); UserDao userDao2 = (UserDao)app.getBean("userDao"); //调用目标对象的方法 // userDao.save(); System.out.println(userDao1); System.out.println(userDao2); } }
当scope的取值为singleton值时,
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置Bean实例
Bean的生命周期:
1.对象创建:当应用加载,创建容器时,对象就被创建了
2.对象运行:只要容器在,对象就一直活着
3.对象销毁:当应用写在,销毁容器时,对象就被销毁
prototype:
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
1.对象创建:当使用对象时,创建新的对象实例
2.对象运行:只要对象在使用中,就一直活着
3.对象销毁:当对象长时间不用时,被Java的垃圾回收机制回收
inti-method 和 destroy-method的意义
init-method:指定类中的初始化方法的名称
destroy-method:指定类中销毁方法的名称
//applicationContext.xml
//UserDaoImpl.java public class UserDaoImpl implements UserDao { //无参构造器 public UserDaoImpl(){ System.out.println("UserDaoImpl创建..."); } //初始化方法 public void init(){ System.out.println("初始化方法..."); } //销毁方法 public void destroy(){ System.out.println("销毁方法..."); } //普通方法 public void save(){ System.out.println("save running..."); } }
public class firstSpring { public static void main(String[] args) { //加载Spring配置文件 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取Spring容器中对应id下的内容 UserDao userDao = (UserDao)app.getBean("userDao"); System.out.println(userDao); app.close(); } }
1.无参构造方法实例化
2.工厂静态方法实例化
3.工厂实例方法实例化
工厂实例化方法还没接触,无参构造方法实例化就是我们上面的那个spring程序一样,那个就是无参构造方法的方式来实例化对象。
工厂静态方法实例化:
//applicationContext.xml //静态工厂
//StaticFactory.java //静态工厂 public class StaticFactory { public static UserDao getUserDao(){ return new UserDaoImpl(); } }
//userdao接口 public interface UserDao { public void save(); }
//userdao实例化 public class UserDaoImpl implements UserDao { //无参构造器 public UserDaoImpl(){ System.out.println("UserDaoImpl创建..."); } //普通方法 public void save(){ System.out.println("save running..."); } }
public class firstSpring { public static void main(String[] args) { //加载Spring配置文件 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取Spring容器中对应id下的内容 //静态工厂实例化 UserDao userDao = (UserDao)app.getBean("userDao"); //调用目标对象的方法 userDao.save(); } }
工厂实例方法实例化:
//applicationContext.xml //实例工厂实例化bean对象
//DynamicFactory.java //实例工厂 public class DynamicFactory { public UserDao getUserDao(){ return new UserDaoImpl(); } }
//userdao接口 public interface UserDao { public void save(); }
//userdao实例化 public class UserDaoImpl implements UserDao { //无参构造器 public UserDaoImpl(){ System.out.println("UserDaoImpl创建..."); } //普通方法 public void save(){ System.out.println("save running..."); } }
public class firstSpring { public static void main(String[] args) { //加载Spring配置文件 ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取Spring容器中对应id下的内容 //静态工厂实例化 UserDao userDao = (UserDao)app.getBean("userDao"); //调用目标对象的方法 userDao.save(); } }
对比了上面的几种方法,我在想:这三种方式存在的意义在哪?我还没搞明白这个。
通过观察上面的代码可以发现有个地方是可以进行优化,那就是配置文件的加载。对于配置文件加载这种繁琐的工作,应该交由service层去完成。
Spring │ ├─main │ ├─java │ │ └─com │ │ └─nothinglin │ │ ├─dao │ │ │ │ UserDao.java │ │ │ │ │ │ │ └─impl │ │ │ UserDaoImpl.java │ │ │ │ │ ├─factory │ │ │ DynamicFactory.java │ │ │ StaticFactory.java │ │ │ │ │ └─service │ │ │ UserService.java │ │ │ │ │ └─impl │ │ UserServiceImpl.java │ │ │ └─resources │ applicationContext.xml │ └─test └─java firstSpring.java
//applicationContext.xml
public interface UserDao { public void save(); }
public class UserDaoImpl implements UserDao { //无参构造器 public UserDaoImpl(){ System.out.println("UserDaoImpl创建..."); } //初始化方法 public void init(){ System.out.println("初始化方法..."); } //销毁方法 public void destroy(){ System.out.println("销毁方法..."); } //普通方法 public void save(){ System.out.println("save running..."); } }
public interface UserService { public void save(); }
public class UserServiceImpl implements UserService { public void save() { ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) app.getBean("userDao"); userDao.save(); } }
public class SpringTest { public static void main(String[] args) { UserService userService = new UserServiceImpl(); userService.save(); } }
通过观察可以发现,这个service层更像是封装起一些繁琐的方法而存在的。
days
hours
minutes
seconds