Spring入门

一:Spring的特点

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


Spring入门_第1张图片
图片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


  
    
    
      
    

测试代码

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


      
    
  • 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

第一种 根据参数的下标来设置

      
      
    
第二种 根据参数名称来设置

      
      
    
第三种 根据参数类型来设置

      
      
    

三:配置文件详解

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


    

2、bean的配置

    
   
  

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

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

自动装配


    
    
    
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;}





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中的作用
提供声明式服务
允许用户实现自定义切面

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

传统设计模式

Spring入门_第2张图片
图片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



    
    
    
        
        
    

  • 后置通知
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

    
    
      
         
         
         
      
     

第三种 通过注解来实现

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

   
    

你可能感兴趣的:(Spring入门)