目前都是用springboot来解决一些日常需求,有一段时间没用springmvc了,在这里总结一下,当作回顾。同时,springmvc也是java后台的基础,值得复习。
bean中的一些配置
scope配置应用场景:
1,action对象:必须是多例;
2,service对象:单例;
3,dao对象:单例
对象生命周期方法:
1,init-method: 初始化方法
2,destroy-method: 销毁方法
springioc容器的依赖注入:
1,构造方法的注入 用constructor-arg
2,setter方法注入 用property
3,p名称空间注入 配置xmlms:p="http://www.springframework.org/schema/p" p:customerDao-ref="customerDao" / p:name="eric" 但是前提是必须写好set方法
4,spEL表达式:springEL表达式,语法变成#{} 例如<property name="customerDao" value="#{customerDao}"/>
注入不同数据类型:
1,普通数据类型 <value> 或者value属性
2,javaBean对象:<ref>或者ref属性
3,数组:<array>
4,List集合:<list>
5:map集合:<map>标签
6,Properties:<props>
如果是用ioc注解方式的话,需要在applicationContext.xml 中开启下ioc注解功能,需要加入新的名称空间,比如在beans中加入
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframwork.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
这样就引入了context的名称空间
然后配置下context的组件扫描
<!-- base-package: IOC注解的类所在的包 -->
<context:component-scan base-package="cn.z"/>
这时候只需要在类上加上@Component就能被ioc感知到,默认的类名是小写字母开头的。
当然也可以改那个名字,用name属性就好。
ioc相关的注解:
@Component:创建对象(用于普通的spring项目)
@Repository:和@Component的作用是一样的,都是用来创建对象(分层项目,Dao层)
@Service:和@Component的作用是一样的,都是用来创建对象(分层项目,Service层)
@Controller:和@Component的作用是一样的,都是用来创建对象(分层项目,web层)
@Scope:单例和多例,如果想要多例,可以在类上加@Scope("prototype")
//下面两个方法要起作用,需要把类设计为单例
@PostConstruct:代替上文配置方式中的init-method
@PreDestroy:代表销毁的方法
×注解方式可以代替xml方式进行ioc工厂。
依赖注入相关的注解:
@Value:注入普通数据类型,value的话很少直接写,都是通过加载配置文件的方式,在applicationContext.xml 中配一下<context:property-placeholder location="classpath:jdbc.properties"/> 就好,然后在实际代码中@Value("{url}")这样引入外部的变量就好。
@Autowired:自动根据类型注入,autowired是注入一个对象,比如:
@Autowired
private CunstomerDao customerDao; // 直接就注入了,是直接赋值给变量,(无需提供构造方法或setter方法),底层直接走反射,赋值给customerDao
通俗来说就是他会去找谁实现了customerDao这个接口,然后看那些impl是不是配置了@Controller这样的注解,如果配置了,就认为是夹在到ioc容器中了,然后就直接去取就行了。
注意:如果spring环境中没有任何一个CustomerDao的类型,那么会注入失败。
如果spring环境中出现了多个impl实现了customerDao,比如第一个是@Contoller(value="customerDao1") 第二个是@Controller(value="customerDao2").....两个impl ,将会失败。
如果确实出现了这种情况怎么办? 这时候可以使用qulifer,他可以配合autowired使用名称
@Qulifer:指定注入的对象名称(也就是id)
使用:@Quelifier(value="customerDao2")
private CustomerDao customerDao;
@Resource:既能够根据类型自动注入,也可以根据对象名称自动注入
用法:如果有两个实现类
@Resource(name="customerDao1")
private CustomerDao customerDao;
@Autowired和@Resource的区别:
1,注入的方式不一样,autowired只能根据类型注入,如果需要根据名称进行注入需要@Qualifier注解的配合,而@Resource既能够根据类型自动注入,也可以根据对象名称注入
2,所属的标准不同
@Autowired来自于spring框架
@Resource来自javaee标准
所以说@Resource会比@Autowired更加标准
所以一般都是用resource注解来注入对象。
spring新注解(零配置注解)
用了这套注解,整个spring开发过程中不需要有任何xml文件!
@Configuration
作用:配置类,用于代替applicationContext.xml 文件
例如写一个配置类,上面写@Configurable
@ComponentScan
作用:代替<context:component-scan/>标签
例如@ComponentScan(basePackages={"cn.sm1234"}
这时候在启动程序中就需要ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
@PropertySource
作用:代替<context:property-placeholder/>配置,加载properties配置文件
用的时候可以在SpringConfig配置类前写@PropertySource(value="classpath:jdbc.properties")
然后在需要用的service类中用@Value("${url}")类引用
@import
如果有很多配置类,那么可以在主配置类中引用其他配置类,@Import(value={JdbcProperties.class})
@Bean
作用:把一个对象放入springioc容器
用法:比如我在service层要get一个Dao,但是这时候这个dao是不在ioc容器中的。
这时候可以这么做:
@Bean(name="custDao")
public CustomerDao getDao(){
return new CustomerDaoImpl(();
}
这样@Bean就有两个作用,一个是可以执行该方法的代码,第二个是把该方法的返回对象放入Spring的IOC容器中。
注意@Bean必须是用在方法的顶部,不能用在类上面
@Bean和@Resource或@Autowired的区别
后者是从springioc容器中获取一个指定类型或者指定名称的对象。前者是执行某个方法,把方法的返回的对象,放入spring的ioc容器。
spring可以整合junit进行简化测试类编写。
倒入spring-test包
有配置文件的方式
在测试类上写:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
然后在测试类中想拿dao的一个对象直接这样写就好了
@Resource
private CustomerDao customerDao;
这样就已经注入了Dao
这一junit版本不要太低。。不然回报错。要是用eclipse开发,就替换eclipse的低版本。
零配置的方式
同样也是在测试类上写:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={SpringConfig.class})
然后注入是和之前是一样的
@Resource(name="customerDao1")
private CustomerDao customerDao;