美文网首页
04IOC进阶

04IOC进阶

作者: RobertLiu123 | 来源:发表于2019-07-22 11:29 被阅读0次

    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)自动注入。)

    相关文章

      网友评论

          本文标题:04IOC进阶

          本文链接:https://www.haomeiwen.com/subject/fvpilctx.html