2018-07-18

依赖注入方式

  • 1.0开始,setter、构造器注入
  • 2.5开始,Autowired注解的基于field方式注入

创建对象并配置如何注入

XML配置

  • 可从类加载路径中加载配置文件(ClassPathXmlApplicationContext),或从文件系统中加载配置文件(FileSystemXmlApplicationContext)。
通过构造器创建bean实例
  1. 首先编写好Product类的Java代码
  2. xml配置bean:
  3. 如果是调用带参数的构造器,可以用constructor-arg参数(这里的参数不仅可以是java基本数据类型,还可以是所依赖的其他对象,如simpleAddress):
   
        
        
        
    

    /********************/

     
        
        
        
        
        
        
    

    
        
        
        
    

  1. ApplicationContext加载xml文件:ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring-config.xml"});
  2. 调用context的getBean获取product对象:Product product1 = context.getBean("product", Product.class);
通过工厂方法创建bean实例
  • 将上述1中xml配置改为
  • 说明:可能还需要Product类本身支持工厂模式,具体情况稍后探究
Setter方式注入
  • 首先要Product类的java代码中有setXXX的形式
  • 用property属性来完成注入:
   
        
        
        
        
        
        
    

    
        
        
        
    

Spring的第一个重要的类:DispatcherServlet

  • DispatcherServlet将使用Spring MVC诸多默认的组件,初始时会在WEB-INF目录下寻找配置文件servletName-servlet.xml。
  • 也可以设置init-param指定其他位置的配置文件
  • /WEB-INF/web.xml:

        springmvc
        
            org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation  //注意这里的值不能变
            /WEB-INF/config/springmvc-config.xml //注意这里的Path值应为配置文件在应用中的相对路径
        
        1    
    

    
        springmvc
        *.action
    

  • /WEB-INF/config/springmvc-config.xml
    
        
        
    
    
    

Autowired注解

@Controller
  • 用在类上
  • 指示这个类的实例是一个控制器
  • 有点:一个控制器类可以包含多个请求处理方法(通过@RequestMapping注解实现),而如果是配置的方法,则只能一个类实现Controller接口,然后实现一个处理方法handleRequest。
  • 生效要求:首先在配置文件 springmvc-config.xml中声明xmlns:context和component-scan元素指定要扫描的包


    
    
    
    


  • 解释:的作用是注册用于支持基于注解的控制器的请求处理方法的bean对象,和可以使用元素
  • 元素指示Spring MVC哪些静态资源需要单独处理(不通过DispatcherServlet,即:阻止任意控制器被调用
  • 若不需要使用,则不需要元素
@RequestMapping
  • 用于注释类或方法
  • 注释的方法将成为一个请求处理方法,并由调度程序在接收到对应URL请求时调用
  • 注释一个控制器类时,将所有的方式都映射为相同类级别的请求,但在具体方法上还可以再设置更精确的映射地址
@RequestMapping(value="/employee_input")
    public String inputEmployee() {
        logger.info("inputEmployee called");
        return "ProductForm";
    }

Model
  • import org.springframework.ui.Model;
  • saveProduct()的第二个参数是Mode类型,无论是否使用,Spring MVC都会在每一个请求处理方法被调用时创建一个Model实例,用于增加需要显示在视图中的属性,通过 model.addAttribute("product", product);来添加,Product实例就可以像被添加到HttpServletRequest中那样访问了。
public String saveProduct(ProductForm productForm, Model model) {
        logger.info("saveProduct called");
        // no need to create and instantiate a ProductForm
        // create Product
        Product product = new Product();
        product.setName(productForm.getName());
        product.setDescription(productForm.getDescription());
        try {
            product.setPrice(Float.parseFloat(
                    productForm.getPrice()));
        } catch (NumberFormatException e) {
        }

        // add product

        model.addAttribute("product", product);
        return "ProductDetails";
    }

@Autowired和@Service
  • @Service注释一个类,表示这是一个服务
  • 服务类也需要像控制类一样设置扫描包的范围
  • @Autowired可以将一个服务类的实例注入到控制类中,注入后可以直接使用该服务类的实例
    @Autowired
    private ProductService productService;// 无需手动new ProductService,
    Product savedProduct = productService.add(product);//直接使用实例productService

@RequestParam
  • 请求参数采用key=value的形式,并用&分隔
  • 例:http://localhost:8080/app/product?productID=3
  • ?问号后面的就是请求参数,key为productID,value为3
  • 传统servlet方法:String productId = httpServletRequest.getParameter("productID")
  • Spring MVC方法:直接在处理该请求的方法的参数列表中加上@RequestParam注解,public void sendProduct(@RequestParam int productID)
  • 参数类型不一定要是字符串,可以设置为自己想要的类型,Spring MVC会尽力转换为非字符串类型
@PathVariable
  • 有时候参数不是采用键值对的方式,也没有?问号分割,而是直接放在了请求中
  • 例如:/product/productID
  • 用SpringMVC的方法,首先在RequestMapping注解的在value属性中添加一个变量,用花括号{}括起来,然后在方法形式参数上加一个同名变量,并用@PathVariable注解
@RequestMapping(value = "/product_view/{id}")
    public String viewProduct(@PathVariable Long id, Model model) {
        Product product = productService.get(id);
        model.addAttribute("product", product);
        return "ProductView";
    }

你可能感兴趣的:(2018-07-18)