Spring入门

一:Spring的特点

1、Spring:春天;--给软件行业带来了春天
2、理念:使现有的技术更加实用。本身是大杂烩整合现有的框架技术
3、Spring优点
轻量级框架
Ioc容器---控制反转
Aop面向切面编程
对事物的支持
对框架的支持
4、主要内容


图片1.png

5、Ioc--inversion of control控制反转
对象由原来程序本身来创建,变为了程序接收对象。程序员主要精力集中于业务实现。实现了service和dao的解耦工作。Service层和dao层实现了分离。没有直接依赖关系。
6、hello spring
步骤:导入相关jar包
commons-logging-1.1.1.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
编写spring配置文件(名称可以自己起)习惯用applicationContext.xml

Hello.java

public class Hello {    
        private String name;
        public void setName(String name) {
            this.name = name;
        }
        public void show(){
            System.out.println("hello,"+name);
        }
    }

Bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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.xsd">  
    
    <bean id="hello" class="com.aiyin.spring.bean.Hello">
      <property name="name" value="Spring"></property>
    </bean>
</beans>

测试代码

public class Test {
    public static void main(String[] args) {
        //解析beans.xml文件 生成管理相应的bean对象
        BeanFactory context = new  ClassPathXmlApplicationContext("beans.xml");
        //Hello hello = (Hello)context.getBean("h4");
        Hello hello= context.getBean(Hello.class);
        hello.show();
    }
}

思考?
Hello对象由谁创建?(Hello对象由Spring容器创建的)
Hello对象属性是怎么设置的?(Hello对象属性是Spring容器来设置的)

这个过程叫做控制反转

控制的内容:指谁来控制对象的创建。。传统的应用程序对象的创建是由程序本身控制的。使用Spring后,是由spring来创建对象的。
反转:正转指程序来创建对象,反转指程序本身不去创建对象,而变为被动的接收的对象。

总结: 以前对象是由程序本身来创建,使用Spring后,程序变为被动接收spring创建好的对象

二:使用Ioc来创建对象有3种方式

  • A)通过无参的构造方法来创建set方法注入
    user.java
public class Hello {
      Public  Hello (){
         System.out.println("user通过无参构造方法创建");
       }
      private String name;
      public void setName(String name) {
          this.name = name;
      }
      public void show(){
          System.out.println("hello,"+name);
      }
  }

bean.xml

<bean id="hello" class="com.aiyin.spring.bean.Hello">
      <property name="name" value="Spring"></property>
    </bean>
  • B)通过有参的构造方法来创建 构造方法注入
    user.java
public class User {
        public User(String name) {
            super();
            this.name = name;
        }
        private String name;
        public void show(){
            System.out.println("name="+name);
        }

bean.xml

第一种 根据参数的下标来设置
<bean id="user" class="com.aiyin.spring.vo.User">
      <!-- index指构造方法  参数下标从0开始 -->
      <constructor-arg index="0" value="李四"></constructor-arg>
    </bean>
第二种 根据参数名称来设置
<bean id="user" class="com.aiyin.spring.vo.User">
      <!-- name指参数名  -->
      <constructor-arg name="name" value="李四"></constructor-arg>
    </bean>
第三种 根据参数类型来设置
<bean id="user" class="com.aiyin.spring.vo.User">
      <!-- 参数类型  -->
      <constructor-arg type="java.lang.String" value="李四"></constructor-arg>
    </bean>

三:配置文件详解

1、align:为bean设置别名,可以设置多个别名

<!-- 设置别名 -->
    <alias name="user" alias="aaa"/>

2、bean的配置

<!-- bean就是java对象  由spring来创建和管理 -->    
   <!-- id是bean的标识符 要唯一  如果没有配置id,name默认标识符 
        如果配置id,又配置了name 那么name是别名
        name可以设置多个别名 分隔符可以 是 空格 逗号 分号
        class是bean的全限定名=包名+类名
        如果不配置 id,和name 那么可以根据applicationContext.getBean(Class) 获取对象
   -->
  <bean id="user" name="user2,u3 u4" class="com.aiyin..."

3、团队协作开发通过improt来实现

import resource="com/aiyin/spring/bean/beans.xml"/>

自动装配

<bean id="userDao" class="com.aiyin.spring02.dao.impl.userDaoMySqlImpl"></bean>
    <!-- autowire自动装配,简化spring配置
         byName根据名称(set方法名后面的)去查找对应的bean,如果有则装配上
     -->
    <bean id="userService" class="com.aiyin.spring02.service.impl.userServiceImpl" autowire="byName">
    </bean>
MicrosoftInternetExplorer4
0
2
DocumentNotSpecified
7.8 磅

Normal

0

@font-face{font-family:"Times New Roman";}@font-face{font-family:"宋体";}@font-face{font-family:"Calibri";}@font-face{font-family:"Consolas";}@font-face{font-family:"Arial";}p.MsoNormal{mso-style-name:正文;mso-style-parent:"";margin:0pt;margin-bottom:.0001pt;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Calibri;mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;}span.10{font-family:'Times New Roman';}span.15{font-family:'Times New Roman';color:rgb(0,0,255);text-decoration:underline;text-underline:single;}span.msoIns{mso-style-type:export-only;mso-style-name:"";text-decoration:underline;text-underline:single;color:blue;}span.msoDel{mso-style-type:export-only;mso-style-name:"";text-decoration:line-through;color:red;}@page{mso-page-border-surround-header:no;    mso-page-border-surround-footer:no;}@page Section0{}div.Section0{page:Section0;}

<!--扫描哪些包可以使用注解
-->

<context:component-scan base-package="com.*" />

xmlns:context=*"http://www.springframework.org/schema/context"**
*
xsi:schemaLocation=*http://www.springframework.org/schema/context*

*   **  **http://www.springframework.org/schema/context/spring-context.xsd"**
*
@Autowired按类型装配 
set
方法可以删除

@Resource 按照名称来装配注入的

@Autowired @Qualifier("userDao") 如果当
[**spring**](http://lib.csdn.net/base/javaee)上下文中存在不止一个
UserDao类型的
bean
时

 

@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注

@Service 业务层

@Controller 控制层

@Repository 持久层

spring使用完全注解开发时,很方便,前提条件是对基本配置足够掌握

userDaoMySqlImpl.java
@Component
public class userDaoMySqlImpl implements userDao {
    @Override
    public void getUser() {
         System.out.println("Mysql得到数据");
    }
}
serServiceImpl.java
public class userServiceImpl implements userService {
    @Autowired
    private userDao userDao;
    
    @Override
    public void getUser() { 
        userDao.getUser();
    }
}

@Autowired是根据类型进行自动装配的。如果当spring上下文中存在不止一个UserDao类型的bean时,我们可以使用@Qualifier配合@Autowired来解决这些问题

userDaoMySqlImpl.java
@Repository(value ="userDao")
public class UserDaoImpl implements UserDao {
   @Override
   public void addUser() {
   }
}

userServiceImpl.java
@Autowired
   public void setUserDao(@Qualifier("userDao")userDao userDao) {
       this.userDao = userDao;
   }

四:面向切面编程(AOP)

1、aop:Aspect Oriented Programming面向切面编程
2、aop在 spring中的作用
提供声明式服务
允许用户实现自定义切面

不改变原有代码,增加新的功能

传统设计模式

图片2.png

3、aop好处
使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情
公共业务由代理来完成---实现业务的分工
公共业务发生改变时,变得更加集中和方便

4、名词解释
关注点:增加的某个业务。如日志。安全。缓存。事务等
切面(Aspect):一个关注点的模块化
通知(Advice):在切面的某个特定的连接点上执行的动作
织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象

5、使用spring实现aop

第一种实现方式-----通过springapi来实现

  • Log.java(前置通知)
public class Log implements MethodBeforeAdvice{
    /**
     * @param method 被调用方法对象
     * @param args 被调用的方法的参数
     * @param target 被调用的方法的目标对象
     * */
    @Override
    public void before(Method method, Object[] args, Object target)
throws Throwable {
        System.out.println(target.getClass().getName() + "的" + method.getName()
                + "方法被执行");
    }

Service 层 用户增删改查
Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean id="userService" class=" com.aiyin.springaop.service.UserServiceImpl"/>
    <bean id="log" class="com.aiyin.springaop.log.Log"/>
    <aop:config>
        <aop:pointcut expression="execution(* com.aiyin.springaop.*.*.*(..))"   id="pointcut"/>
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
    </aop:config>
</beans>
  • 后置通知
public class AfterLog implements AfterReturningAdvice{
    /**
     * 目标方法执行后执行的通知
     * returnValue--返回值
     * method 被调用的方法对象
     * args 被调用的方法对象的参数
     * target 被调用的方法对象的目标对象
     * */
    @Override
    public void afterReturning(Object returnValue, Method method,
            Object[] args, Object target) throws Throwable {
        System.out.println(target.getClass().getName()+"的"+method.getName()+"被成功执行,返回值是:"+returnValue);
    }

Aop的重要性:很重要
Spring aop就是将公共的业务(如日志,安全等)和领域业务结合。当执行领域业务时将会把公共业务加进来。其本质就是动态代理

第二种方式实现aop:自定义类来实现

Log.java
public class Log {
    public void before() {
        System.out.println("-------方法执行前---------");
    }
    public void after() {
        System.out.println("-------方法执行后----------");
    }
}

Beans.xml
<bean id="userService" class=" com.aiyin.springaop.service.UserServiceImpl"/>
    <bean id="log" class="com.aiyin.springaop.log.Log"/>
    <aop:config>
      <aop:aspect ref="log">
         <aop:pointcut expression="execution(* com.aiyin.springaop.service.*.*(..))" id="pointcut"/>
         <aop:before method="before" pointcut-ref="pointcut"/>
         <aop:after-returning method="after" pointcut-ref="pointcut"/>
      </aop:aspect>
    </aop:config> 

第三种 通过注解来实现

Log.java
@Aspect
@Component
public class Log {
    @Before("execution(* com.aiyin.springaop.service.*.*(..))")
    public void before() {
        System.out.println("-------方法执行前---------");
    }
    @After("execution(* com.aiyin.springaop.service.*.*(..))")
    public void after() {
        System.out.println("-------方法执行后----------");
    }
    @Around("execution(* com.aiyin.springaop.service.*.*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前");
        System.out.println("签名:"+pjp.getSignature());
        // 执行目标方法
        Object result =pjp.proceed();
        System.out.println("环绕后");
        return result;
    }
UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
    @Override
    public void add(int a) {
        System.out.println("增加用户");
    }
    @Override
    public void update() {
        System.out.println("修改用户");
    }
   .................
beans.xml
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
   <context:component-scan base-package="com.*" />
    <aop:aspectj-autoproxy />
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,608评论 18 399
  • spring 简介 作用:IOC容器,控制反转,将创建对象的权利交给容器去做 好处:不用new对象,降低了类与类之...
    凉希凉兮阅读 244评论 0 0
  • spring @(JAVAWEB) 介绍(基于spring 4.2.4)对象的容器,spring负责管理项目中的所...
    舒官人阅读 1,131评论 0 1
  • 文:ShakespeareSky(莎士比亚斯基) 12月13日 准备消失吧 1885 一大早睁开眼睛,发现自己居然...
    ShakespeareSky阅读 215评论 0 0