spring的配置及ioc注解总结

目前都是用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;

































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值