`

Spring MVC (二)

    博客分类:
  • J2EE
阅读更多
一、IOC和DI的理解
1、两个词:控制、反转
类的实现的控制权从调用类中移除并转交个容器(Spring)
2、DI更好的阐述了以上概念
类的实现依赖容器注入更加清晰
3、DI的类型
构造函数的注入、属性注入(setter注入)、接口注入
interface Service {
	public void injectUserDao(UserDao userDao);
}

class UserService implements Service {
	private UserDao userDao;

	//构造函数的注入
	public UserService(UserDao userDao) {
		this.userDao = userDao;
	}
	
	// 属性的注入
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	//接口注入
	@Override
	public void injectUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}
 
4、容器的注入
<?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="userDAO" class="com.sosop.dao.imp.UserDAOImp" />
    <bean id="userService" class="com.service.imp.UserServiceImp" 
    p: userDAO-ref="userDAO"/>
</beans>
 实现原理:使用java的反射机制
由ClassLoader的loadClass("com.sosop....")加载字节码Class对象,再由Class对象newInstance生成实例以及获得类的构造方法、字段以及方法等成员,具体参考java的反射
5、资源抽象接口
Resource接口有很多实现类,如ClassPathResource,FileSystemResource等
资源地址的表达式:
类路径加载资源:classpath: com/sosop/...
目录中加载资源:file:/home/sosop/...
WEB服务器中加载资源:http://www.sososp.com/...
ftp服务器中加载资源:ftp://www.sosop.com/...
ApplicationContext对应的类: com/sososp/bean.xml
 
二、IoC容器装配bean
 1、装配一个bean
<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="idName" class="package.class">
</bean>
 
 2、bean命名:尽量使用id,避免使用name
区别就是name上命名几乎没有任何限制,使用id吧
3、依赖注入
<?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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- 属性注入 -->
	<bean id="user1" class="com.sosop.model.User">
		<property name="name"><value>sosop</value></property>
	</bean>
	<bean id="user2" class="com.sosop.model.User">
		<property name="name" value="sosop"/>
	</bean>
	<bean id="friend" class="com.sosop.model.User"/>
	<bean id="user3" class="com.sosop.model.User">
		<property name="friend" ref="friend"/>
	</bean>
	
	<!-- 构造器注入 -->
	<bean id="user4" class="com.sosop.model.User">
		<!-- 这里还有根据类型type、根据index参数的顺序 -->
		<constructor-arg name="name" value="sosop"/>
	</bean>
	
	<!-- 非静态工厂类 -->
	<bean id="factory"  class="com.sosop.UserFactory"/>
	<bean id="user5" factory-bean="factory" factory-method="createUser"/>
	
	<!-- 静态工厂类 -->
	<bean id="user6" class="com.sosop.StaticUserFactory" factory-method="getInstance"/>
	<bean/>
	
	<!-- null -->
	<bean id="user7" class="com.sosop.model.User">
		<property name="name"><null/></property>
	</bean>
	
	<!--级联  -->
	<bean id="user8" class="com.sosop.model.User">
		<property name="friend.name"><value>oudi</value></property>
	</bean>
	
	<!-- 集合 -->
	<bean id="user9" class="com.sosop.model.User">
		<!-- List -->
		<property name="books">
			<list>
				<value>java</value>
				<value>c</value>
				<value>ruby</value>
			</list>
		</property>
		<!-- Set -->
		<property name="hobies">
			<list>
				<value>football</value>
				<value>swimming</value>
				<value>girls</value>
			</list>
		</property>
		<!-- Map -->
		<property name="phone">
			<map>
				<entry key="telephone" value="1234567"/>
				<entry key="mobilphone" value="18888888888"/>
			</map>
		</property>
		<!-- Porperties -->
		<property name="mails">
			<props>
				<prop key="sian">aaa@sina.com</prop>
				<prop key="gmail">xxx@gmail.com</prop>
			</props>
		</property>
	</bean>
	<!-- 
		记住集合合并:父集合有abstract,子集合parent,集合属性merge=true
		方便快捷的配置集合类型使用util命名空间
	 -->
	 
	 <!-- 
	 使用P命名空间:xmlns:p="http://www.springframework.org/schema/p"
	 -->
	 <bean id="user10" class="com.sosop.model.User" p:name="sosop" p:friend-ref="friend" />
	 
	 
</beans>
 
5、自动装配
byName、byType、constructor、autodetect(有默认构造则用byType,否则用constructor)
6、类之间的关系
继承:父类abstract=true  子类parent="父类id"
依赖:depends-on="classId"
引用:p: id="classId"   <idref bean="classId"/>
7、整合多个配置文件
在applicationContext.xml中整合多个配置文件,当多个人开发一个项目,每个人负责一个模块或功能时,很有用
<import resource="classpath*: com/sosop/*" />
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>

8、bean的作用域:singleton、prototype、request、session、globalSession
 三、基于注解配置
现在在项目中一般都使用注解的方式,方便简洁
下面是不久前做的一个项目部分注解配置
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd">


	<aop:aspectj-autoproxy proxy-target-class="true"/>

	<context:annotation-config />

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

	<context:property-placeholder location="classpath:jdbc.properties" />

	<tx:annotation-driven transaction-manager="transactionManager"
                                       proxy-target-class="true"/>
                                       
    <mvc:annotation-driven />
    
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:locations="classpath:jdbc.properties" p:fileEncoding="utf-8" />

	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="${jdbc.drive}"
		p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}"
		p:maxActive="${jdbc.maxActive}" p:maxIdle="${jdbc.maxIdle}" p:maxWait="${jdbc.maxWait}"
		p:defaultAutoCommit="${jdbc.defaultAutoCommit}" />

	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
		p:dataSource-ref="dataSource" />

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="find*" read-only="true" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="serviceOperation"
			expression="execution(* com.tcl.phone.service..*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
	</aop:config>

	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
		p:dataSource-ref="dataSource" 
		p:configLocation="classpath:com/tcl/phone/data/mybatis-config.xml"
		p:mapperLocations="classpath*:com/tcl/phone/data/*Mapper.xml" />
		
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
    	<constructor-arg index="0" ref="sqlSessionFactory"/>  
	</bean> 
	    
</beans>
 
package com.tcl.phone.model;

import org.springframework.stereotype.Component;

@Component
public class Admin {
	private int id;
	private String name;
	
	public Admin() {}
	
	public Admin(int id) {
		super();
		this.id = id;
	}
	public Admin(String name) {
		super();
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
 
package com.tcl.phone.dao.imp;

import org.springframework.stereotype.Repository;

import com.tcl.phone.dao.IAdminDAO;
import com.tcl.phone.model.Admin;

@Repository("adminDAO")
public class AdminDAO extends BaseDAO<Admin> implements IAdminDAO {
	
}
 
package com.tcl.phone.service.imp;


import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.tcl.phone.dao.IAdminDAO;
import com.tcl.phone.model.Admin;
import com.tcl.phone.service.IAdminService;


@Service("adminService")
public class AdminService implements IAdminService {

	private IAdminDAO adminDAO;
	
	@Resource(name="adminDAO")
	public void setUserDao(IAdminDAO adminDAO) {
		this.adminDAO = adminDAO;
	}

	@Override
	public boolean validAdmin(String name) {
		Map<String, Object> map = new HashMap<>();
		map.put("a_name", name.trim());
		Admin admin = adminDAO.selectByFields(map);
		if(admin == null)
			return false;
		else
			return true;
	}

	@Override
	public String save(Admin admin) {
		//admin.setName(admin.getName().trim().replace(" ", "."));
		return String.valueOf(adminDAO.insert(admin));
	}

	@Override
	public String remove(String name) {
		Map<String, Object> map = new HashMap<>();
		map.put("a_name", name);
		return String.valueOf(adminDAO.deleteByField(map));
	}

	@Override
	public Set<String> query() {
		Set<String> admins = new HashSet<>();
		for(Admin admin : adminDAO.select(new Admin())) {
			admins.add(admin.getName());
		}
		return admins;
	}
}
 
package com.tcl.phone.web.controller;

import java.util.Map;
import java.util.Set;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.tcl.phone.model.Admin;
import com.tcl.phone.service.IAdminService;
import com.tcl.phone.utils.CollectionUtil;
import com.tcl.phone.utils.Constant;
import com.tcl.phone.utils.LDAPUtil;

@Controller
public class AdminController {
	
	private IAdminService adminService;
	
	@Resource(name="adminService")
	public void setAdminService(IAdminService adminService) {
		this.adminService = adminService;
	}

	@RequestMapping(Constant.ADMIN_ADD_PATH)
	public @ResponseBody String addAdmin(@RequestParam String name) {
		String real = name.trim();
		return adminService.save(new Admin(real));
	}
	
	@RequestMapping(Constant.ADMIN_REMOVE_PATH)
	public @ResponseBody String removeAdmin(@RequestParam String name) {
		return adminService.remove(name.trim());
	}
	
	@RequestMapping(Constant.ADMIN_SHOW_PATH)
	public ModelAndView showAdmin() {
		ModelAndView mav = new ModelAndView();
		Set<String> admins = adminService.query();
		Map<String, String> users = LDAPUtil.getUsers();
		mav.addObject("admins", admins);
		//mav.addObject("users", new CollectionUtil<String>().sub(users, admins));
		mav.addObject("users", new CollectionUtil<String, String>().removeKeys(users, admins));
		mav.addObject("menu", 11);
		mav.setViewName(Constant.ADMIN_PAGE_PATH);
		return mav;
	}
}
<context:component-scan base-package="org.example">
    <context:include-filter type="regex" expression=".*Stub.*Repository"/>
    <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
 
@Autowire和@Qualifier很少用
 
分享到:
评论

相关推荐

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

    最全最经典spring-mvc教程

    Spring MVC 是一款强大的Java Web开发框架,用于构建高效、可维护和模块化的Web应用程序。它作为Spring框架的一部分,提供了一种优雅的方式来处理HTTP请求和响应,使得开发者可以专注于业务逻辑而不是底层实现。在这...

    Spring MVC 4.2.3

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够有效地分离业务逻辑、数据处理和用户界面。在"Spring MVC 4.2.3"版本中,我们看到了一系列的...

    spring mvc 4.0

    Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。在Spring MVC 4.0版本中,它引入了许多改进和新特性,以提升开发效率和应用程序的性能。 1. **依赖注入**:Spring ...

    Spring.MVC-A.Tutorial-Spring.MVC学习指南 高清可复制版PDF

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。这个教程“Spring MVC - A Tutorial”旨在帮助开发者深入理解和掌握Spring MVC的核心概念和...

    Spring MVC 教程快速入门 深入分析

    二、Spring MVC核心类与接口:Spring MVC架构中包含许多核心组件,如DispatcherServlet、HandlerMapping、Controller、ViewResolver等。这些组件协同工作,处理用户的请求并返回相应的响应。 三、Spring MVC核心...

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...

    Spring MVC + Mybatis+Spring实现的个人博客系统

    这是一个基于Spring MVC、Mybatis和Spring框架实现的个人博客系统,涵盖了Web开发中的后端架构设计、数据库管理和前端展示等多个方面。以下将详细介绍这个系统的关键知识点: **1. Spring MVC** Spring MVC是Spring...

    spring mvc框架依赖全面jar

    Spring MVC 是一个基于 Java 的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本压缩包中包含了一系列与Spring MVC相关的jar文件,这些文件是构建和运行Spring MVC项目所...

    Spring MVC所需jar包

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一个重要模块,主要用于构建 Web 应用程序的后端控制层。这个框架提供了模型-视图-控制器(MVC)设计模式的实现,简化了Java Web应用的开发...

    Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码.zip

    Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用...

    Spring MVC使用Demo

    Spring MVC是Spring框架的一个核心模块,专用于构建Web应用程序。这个"Spring MVC使用Demo"提供了实践操作,帮助开发者深入理解Spring MVC的开发环境配置、注解的使用以及工作原理。 首先,Spring MVC的设计模式...

    spring MVC .docx

    Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。Spring MVC的设计目标是提供一个清晰的组件化架构,使得开发者可以独立地开发和测试控制器、...

    基本的spring mvc + spring security实现的登录(无数据库)

    在本项目中,我们主要探讨的是如何利用Spring MVC和Spring Security框架构建一个基本的无数据库登录系统。Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    Spring MVC 和 MyBatis 是两个在Java Web 开发中广泛使用的框架。Spring MVC 作为Spring框架的一部分,负责处理HTTP请求并转发到相应的业务逻辑,而MyBatis则是一个轻量级的持久层框架,用于简化数据库操作。整合这...

    Spring MVC 简单Demo

    Spring MVC 是一款基于Java的轻量级Web应用框架,它为构建RESTful应用程序提供了强大的支持。这个"Spring MVC 简单Demo"旨在帮助初学者理解如何设置和运行一个基本的Spring MVC项目。下面,我们将深入探讨Spring MVC...

Global site tag (gtag.js) - Google Analytics