Bean其他高级配置
Bean的作用域 scope
1)singleton (单例 默认)
<bean id="simplePropertyDemo1" class="com.neuedu.spring.chap02.SimplePropertyDemo">
<constructor-arg name="userName" value="root"></constructor-arg>
<constructor-arg name="password" value="123456"></constructor-arg>
</bean>
测试类
@Test
public void test1(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
SimplePropertyDemo spd=(SimplePropertyDemo) ctx.getBean("simplePropertyDemo1");
System.out.println(spd);
SimplePropertyDemo spd2=(SimplePropertyDemo) ctx.getBean("simplePropertyDemo1");
System.out.println(spd2);
}
打印结果
com.neuedu.spring.chap02.SimplePropertyDemo@42eca56e
com.neuedu.spring.chap02.SimplePropertyDemo@42eca56e
2)prototype (多例)
有状态bean时使用(每次都需要新创建一个bean时)
同样是上面的例子,我稍加改动,把bean定义里加一个scope="prototype"(多例)
打印结果如下
com.neuedu.spring.chap02.SimplePropertyDemo@42eca56e
com.neuedu.spring.chap02.SimplePropertyDemo@192d3247
3)request (web有效)
4)session (web有效)
5)global session(porlet不常用)
bean的延迟加载(懒加载)
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化(也就是依赖注入)
意思是:1)如果scope="singleton" 默认时启动时加载
2)如果scope="prototype" 就是延迟加载
3)scope="singleton" 并且lazy-init="true" 应该也是懒加载
默认为false,启动时加载;
当lazy-init="true" 懒加载。调用getBean时才加载
bean的继承(了解)
简单实例
<bean id="parent1" class="com.neuedu.pojo.User">
<property name="password" value="123456"></property>
</bean>
<bean id="user1" class="com.neuedu.pojo.User" parent="parent1">
<property name="name" value="zzf"></property>
</bean>
<bean id="user2" class="com.neuedu.pojo.User" parent="parent1">
<property name="name" value="lwk"></property>
</bean>
整合多个配置文件
<?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-4.3.xsd">
<import resource="bean1.xml"/>
<import resource="bean2.xml"/>
......
</beans>
基于注解的配置
step 1:修改xml头部描述
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.neuedu"/>
step2:写dao,service接口和实现类
public interface IPowerDao {
public void del(int id);
}
@Repository("powerDao")
public class PowerDaoImpl implements IPowerDao {
@Override
public void del(int id) {
System.out.println("del power");
}
}
public interface IPowerService {
public void del(int id);
}
@Service("powerServie")
public class PowerServieImpl implements IPowerService {
@Autowired
IPowerDao powerDao;
@Override
public void del(int id) {
System.out.println("del service");
powerDao.del(id);
}
public void setPowerDao(IPowerDao powerDao) {
this.powerDao = powerDao;
}
}
step 3写测试类
public class ScanTest {
@Test
public void test1(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml");
IPowerService service=(IPowerService) ctx.getBean("powerServie");
service.del(1);
}
}
@Qualifier
如果一个接口有多个实现类,注入时需要用@Qualifier 明确引用哪个名字的实现类
@Autowired
@Qualifier("userDaoImpl")
public IUserDao userDao;
注意:如果service里既有有参构造(缺少无参构造)又有属性set方法,@Qualifier会提示构造方法异常。
解决方法有二:1)删除有参构造,只保留set方法
2)增加无参构造
基于注解的配置
我们在搭建环境时曾经试过
@Controller 组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。
@Service 组合注解(组合了@Component注解),应用在service层(业务逻辑层)
@Reponsitory 组合注解(组合了@Component注解),应用在dao层(数据访问层)
@Component 表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。
@Autowired Spring提供的工具(由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入。)
网友评论