SSM学习笔记
SSM学习笔记
Spring_quickstart的对象注入
<bean id = "bookService" class="com.cwnu.service.Impl.bookServiceImpl">
<property name="bookDao" ref="bookDao"/> <!--注入对象,name指的是声明的对象的名字,ref指的是xml中对象的id名称-->
</bean>
<bean id = "bookDao" class="com.cwnu.dao.Impl.bookDaoImpl"/>
//bookService类的bookDao对象创建方式
public class bookServiceImpl implements bookService {
bookDao bookDao;//只用声明对象,但不用new,对象由IOC容器提供(在XML中配置)
@Override
public void save() {
System.out.println("bookService save...");
bookDao.save();
}
//创建对象的方法
public void setBookDao(bookDao bookDao){
this.bookDao = bookDao;
}
}
//main方法的写法
public class APP {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
bookService bookService = (bookService) ctx.getBean("bookService");
bookService.save();
}
}
Bean配置
基本配置
<bean id = "bookService" class="com.cwnu.service.Impl.bookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
<bean id = "bookDao" class="com.cwnu.dao.Impl.bookDaoImpl"/>
别名配置
<bean id = "bookService" name="service,service2,service3" class="com.cwnu.service.Impl.bookServiceImpl"> <!--name属性表示别名,可用空格,逗号,分号分隔-->
<property name="bookDao" ref="bookDao"/>
</bean>
<bean id = "bookDao" class="com.cwnu.dao.Impl.bookDaoImpl"/>
作用范围配置
spring默认配置的对象是单例,我们需要用scope配置,prototype是多例,singleton是单例
bean的实例化
1、容器通过构造方法实现对象
public class bookDaoImpl implements bookDao {
public bookDaoImpl(){//可以用public,也可以用private
System.out.println("无参构造器...");
}
@Override
public void save() {
System.out.println("bookdao save...");
}
}
2、使用静态工厂实现对象
3、使用实例工厂实现对象
4、使用FactoryBean实现对象
Bean的生命周期
依赖注入方式
setter注入
1、引用类型
public class bookServiceImpl implements bookService{
bookDao bookDao;
public void setBookDao(bookDao bookDao){
this.bookDao = bookDao;
}
//其他事务处理
}
<bean id = "bookService" class="com.cwnu.service.Impl.bookServiceImpl">
<property name="bookDao" ref="bookDao"/> <!--用property标签设置-->
</bean>
2、基本类型
<bean id = "bookDao" class="com.cwnu.dao.Impl.bookDaoImpl">
<property name="name" value="周锦"/>
<property name="num" value="20"/>
</bean>
public class bookDaoImpl implements bookDao {
private int num;
private String name;
public void setName(String name){
this.name = name;
}
public void setNum(int num){
this.num = num;
}
//其他事务处理
}
构造器注入 (自己做模块不推荐使用)
依赖自动装配
集合注入
1、数组注入
2、list注入
3、set注入
4、map注入
5、property注入
第三方数据管理
<!--管理德鲁伊德数据库资源对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_fruit"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
用properties文件加载数据
加载properties文件的方式
创建容器的方式
获取Bean的方式
注解开发
注解开发定义Bean
@component:
@service 业务层
@repository 数据层
@controller 表现层
//上述四个是相同的意思,只是用下面的三个增强可读性
注解方式定义Bean的生命周期
注解方式的依赖注入
引用类型的注入
简单类型的注入
加载外部properties文件
第三方Bean的管理
第二种扫描式不太推荐
第三方Bean的依赖注入
Spring整合Mybatis
spring整合Junit
面向AOP编程
//pom.xml中的maven配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
//main方法
public class app {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
BookDao bookDao = ctx.getBean(BookDao.class);
bookDao.update();
}
}
dao层
//接口
public interface BookDao {
public void save();
public void update();
}
//实现类
@Repository
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println(System.currentTimeMillis());//切面,用于对比
System.out.println("book dao save...");
}
@Override
public void update() {
System.out.println("book dao update...");
}
}
aop层
//aop
@Component //表示一个Bean
@Aspect //添加此注解,下面的那些才能有用
public class MyAdvice {
@Pointcut("execution(void com.cwnu.dao.BookDao.update())") //切入点,表示执行到update()方法
private void pc(){}
@Before("pc()") //表示在执行到update()方法之前执行method()方法,method()是切入方法
public void method(){
System.out.println(System.currentTimeMillis());
}
}
config层
@Configuration //这是一个配置类
@ComponentScan("com.cwnu") //扫描包,在这个扫描路径下的Bean才能实现对象
@EnableAspectJAutoProxy //切面驱动,有这个注解才能使用面向AOP编程
public class SpringConfig {
}
SpingMvc
<!--依赖配置-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
controller
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save..");
return "{'name':'zhoujin'}";
}
}
config
//SpringMvc配置
@Configuration
@ComponentScan("com.cwnu.controller")
public class SpringMvcConfig {
}
//Servlet容器,加载tomcat时候加载这个类
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class); //容器加载springmvc配置
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
乱码处理
对于post类请求,如果提交的数据有中文,可能会出现乱码,对此我们在ServletContainerInitConfig类里面添加过滤器
//乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
传参
基本类型的传参
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(@RequestParam("name") String name, @RequestParam("sex") String
sex){
System.out.println(name);
System.out.println(sex);
return name;
}
pojo对象的传参
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println(user);
return user.toString();
}
//直接在请求路径后面添加pojo的属性,springmvc自动封装成对象
嵌套pojo对象的传参
日期类型
响应
很简单,不赘述
Rest风格
SSM整合
SpringConfig.java
@Configuration
@ComponentScan("com.cwnu.service")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class, MybatisConfig.class})
public class SpringConfig {
}
Spring整合Mybatis
JdbcConfig.java
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
MybatisConfig.java
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setTypeAliasesPackage("com.cwnu.domain");
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.cwnu.dao");
return mapperScannerConfigurer;
}
}
Spring整合SpringMvc
ServletConfig.java
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SpringMvcConfig.java
@Configuration
@ComponentScan("com.cwnu.controller")
@EnableWebMvc
public class SpringMvcConfig {
}