Spring的使用技巧
基本概念
在没有Spring之前,程序是通过public UserService user = new UserService()的形式,来给一个变量赋予引用值,user变量定义后就可以直接user.xxx()的来调用方法.
在有Spring之后,可以直接使用public UserService user的形式给来定义变量,而省略new UserService()这一部分,这部分由Spring来进行.
由Spring创建对象,称其为"控制反转",Spring创建对象的过程中,发现对象里面还有一个成员变量需要赋值,赋值的过程称为"依赖注入".
控制反转
简称为IOC,英文全称:Inversion of Control,为什么原本自己new一个对象
使用注解
告诉了Spring大佬new哪个对象后,如果对象里面有成员变量,还得告诉大佬,得给这个成员变量赋值,具体XML实例如下:
说明:
第一个bean
id:以后读取的时候,就是读取这个id来得到对象
factory-bean:指定生产者
factory-method:指定生产者所使用的方法
第二个bean:创建一个com.Factory类的叫factory的对象
//测试
public static void main( String[] args )
{
ClassPathXmlApplicationContext cpac =
new ClassPathXmlApplicationContext( "applicationContext.xml");
Robot robot = (Robot) cpac.getBean("robot");
robot.say();
}
Spring的FactoryBean接口实例化
类实现FactoryBean
配置XML文件,bean的实例为getObject方法的返回值
具体实例如下所示:
//java代码
public class Factory implements FactoryBean
br/>@Override
return new User(1,"李白","123");}
@Override
br/>}
@Override
getObjectType() {
return User.class;
}
}
//xml配置
//注:在测试类中,使用getbean("user")即可得到User的实例
当bean已经配置成功后,如何测试呢?
首先得读取xml配置文件:
ApplicationContext context= new ClassPathXmlApplicationContext( "applicationContext.xml");
然后通过调用其方法,得到对象:
User user = context.getBean("user", User.class)
下面总结一下基本的API吧
核心API
BeanFactory IOC容器的基本接口
ApplicationContext 扩展的IOC容器接口
ClassPathXmlApplicationContext 基于xml配置文件的IOC容器
依赖注入
英文简称DI
英文全称: Dependency Inject
注入方式
setter注入
必须提供setter方法
构造器注入
注:name和index任选一项即可代表你的选择
bean的作用域
prototype
原型 => 每次创建一个实例
singleton
单例[默认] => 一个bean的定义,只有一个实例,不是一个类只有一个实例
request
一个请求一个实例
session
一个会话一个实例
websocket
一次websocket链接一个实例
bean的生命周期
初始化和销毁
在bean配置上写init-method和destroy-method
实现InitializingBean和DisposableBean及其方法
在容器关闭的时候销毁
//例:
public class Cycle2 implements InitializingBean, DisposableBean {@Override
br/>@Override
}
@Override
br/>System.out.println("开始....");
}
@Override
System.out.println("结束了....");
}
}
配置方式
ps:下面的代码实现,是在IDEA中使用Maven来进行构建和管理,不会Maven的可以去网站:https://how2j.cn/k/idea/idea-maven-config/1353.html学习学习
方式一[纯XML实现]
项目结构
APP类
public class App
{
public static void main( String[] args )
{
ClassPathXmlApplicationContext cpac =
new ClassPathXmlApplicationContext(
"applicationContext.xml");
MainUI mainUI = cpac.getBean("mainUI", MainUI.class);
mainUI.mainUI();
}
}
MianUI类
public class MainUI {
private UserService userService;
public void mainUI(){
Scanner temp = new Scanner(System.in);
while(true){
System.out.println("请输入登录账号:");
String account = temp.next();
System.out.println("请输入登录密码:");
String password = temp.next();
User user = userService.judgeUser(account, password);
if(null != user){
System.out.println("登录成功");
System.exit(0);
}else{
System.out.println("账号或密码错误,请重新登录");
}
}
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
在此类中,声明了UserService类的userService变量,区别于传统的赋值方式,这里仅仅只是声明了该变量,根据java的编程规范,未赋值的引用变量,默认值为null.
Spring要做的,就是将userService赋值,而采用xml配置方式,是需要setter方法的,所以在最后添加了一个setUserService方法
UserServiceImpl类
public class UserServiceImpl implements UserService {
private UserDAO userDAO;@Override
br/>@Override
return userDAO.select(account,password);
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
代码分析:有一个变量userDAO需要赋值
UserDAOImpl类
public class UserDAOImpl implements UserDAO {
private QueryRunner qr;@Override
br/>@Override
//建立一个解决数据库下划线问题的对象
BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
//准备sql语句,实际应用时不要用 来查询,影响效率
String sql = "select from user where user_account=? and user_password=?";
//准备填充数据
Object[] obj = {account,password};
//进行查询操作
User user = null;
try {
user = qr.query(sql, new BeanHandler
} catch (SQLException e) {
throw new RuntimeException("query异常",e);
}
return user;
}
public void setQr(QueryRunner qr) {
this.qr = qr;}
}
此代码中,有一个名叫qr的成员变量需要赋值,而这里还执行了数据库的查询操作,需要在pom.xml文件中引入jar包
User类
@Data
br/>}
}
此代码中,有一个名叫qr的成员变量需要赋值,而这里还执行了数据库的查询操作,需要在pom.xml文件中引入jar包
User类
@Data
br/>@NoArgsConstructor
private int UserId;
private String UserAccount;
private String UserPassword;
}
在这里,使用了lombok来给私有的成员变量建立getter、setter方法和空参构造及有参构造
applicationContext.xml文件配置
druid.properties文件
jdbc.classDriver=com.MySQL.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/blog?userUnicode=true&characterEncoding=utf8
jdbc.user=root
jdbc.password=root123
pom.xml文件配置
完整代码已上传:
链接:https://pan.baidu.com/s/1X64xcNhcqxOkr6sntraiBw
提取码:upuc
方式二[注解]
通过注解方式可以更加快速配置,只需要在类上面加上注解即可
注册springbean
@Controller 加在Controller层的实现类上
@Service 加在Service层的实现类上
@Repository 加在Dao层的实现类上@Component加类上,该类就会被Spring识别
br/>@Component加类上,该类就会被Spring识别
生命周期 @PostConstruct @PreDestroy
作用域范围 @Scope方式三[java配置]
注解:
@Bean
br/>方式三[java配置]
注解:
@Bean
br/>@Configuration
br/>@ComponentScan
再次简化
加入@Controller…@Autowired
br/>再次简化
加入@Controller…@Autowired
AOP
Aspect Oritented Programming AOP 面向切面编程
Object Oritened Proguramming OOP 面对对象编程
概念
具有横切性质的系统功能,例如:日志记录、性能统计、事务管理、安全检查等等。散布在系统的各个类中。需要一种机制能将这类功能自动加入到需要的位置中去。这种机制就是AOP。
名词
连接点 joinpoint 需要加入功能的位置(方法)
切入点 pointcut 执行加入功能的连接点,从连接点选出的需要加入功能的连接点
通知 advice 需要实现的功能
切面 aspect 切入点和通知的组合
目标对象 target 连接点(方法)所在的对象
织入 weave 将切面应用到目标对象的过程
步骤
1) 编写service类
2) 编写通知 , 实现MethodBeforeAdvice接口
//method 要执行的方法
// args 方法的参数
// target 方法所在的对象
public void before(Method method, Object[] args, Object target) throws Throwable {
}
3)配置xml
配置service
配置通知
配置切入点,class= org.springframework.aop.support.JdkRegexpMethodPointcut ,配置属性pattern=> service的方法
配置切面,class=org.springframework.aop.support.DefaultPointcutAdvisor 连接切入点和通知
包装service类, class= org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
获取bean,调用方法,将会看到通知执行了
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
通知类型
前置通知 : 方法执行之前 MethodBeforeAdvice
后置通知 : 方法执行之后 AfterReturningAdvice
环绕通知 : 方法执行前后 MethodInterceptor
异常通知 : 抛出异常时
最终通知 : finally执行时
注:面向接口编程 1)解耦,修改实现类 2)默认使用接口的方式生成代理
依赖
aspectj
通知类型
前置通知 : 方法执行之前 MethodBeforeAdvice
后置通知 : 方法执行之后 AfterReturningAdvice
环绕通知 : 方法执行前后 MethodInterceptor
异常通知 : 抛出异常时
最终通知 : finally执行时
注:面向接口编程 1)解耦,修改实现类 2)默认使用接口的方式生成代理
依赖
aspectj
创新互联提供高防服务器、云服务器、香港服务器、成都服务器托管等
文章标题:Spring的使用技巧
分享地址:http://myzitong.com/article/ppggpc.html