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中配置)@Overridepublic 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,也可以用privateSystem.out.println("无参构造器...");}@Overridepublic 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 {@Overridepublic void save() {System.out.println(System.currentTimeMillis());//切面,用于对比System.out.println("book dao save...");}@Overridepublic 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")@ResponseBodypublic 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 {@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class); //容器加载springmvc配置return ctx;}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected 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") Stringsex){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;@Beanpublic 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 {@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setTypeAliasesPackage("com.cwnu.domain");sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage("com.cwnu.dao");return mapperScannerConfigurer;}
}
Spring整合SpringMvc
ServletConfig.java
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}
SpringMvcConfig.java
@Configuration
@ComponentScan("com.cwnu.controller")
@EnableWebMvc
public class SpringMvcConfig {
}