侧边栏壁纸
博主头像
Johnny博主等级

学无先后,达者为师

  • 累计撰写 11 篇文章
  • 累计创建 4 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Spring

Johnny
2022-06-26 / 0 评论 / 0 点赞 / 62 阅读 / 1,001 字

Spring

Bean

Bean的生命周期控制

通过配置的方式

<bean id="bookDao" class="com.johnnycv.dao.impl.BookDaoImpl" name="service" init-method="init" destroy-method="destory"/>

通过接口实现

public class BookServiceImpl implements InitializingBean, DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("destroy...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("init...");
    }
}

依赖注入

依赖注入

setter注入

setter注入引用类型

通过xml中bean的配置添加到引用的类型

<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">
<!--配置关系-->
         <property name="bookDao" ref="bookDao"/>  <!--name为成员变量的名称,ref为指向的引用bean的id-->
</bean>
setter注入简单类型

通过xml中bean的配置添加到引用的类型

<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">
<!--配置关系-->
         <property name="bookDao" value="****"/>  <!--name为成员变量的名称,value为属性的值-->
</bean>

构造器注入

注入引用类型
<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">
                <constructor-arg name="bookDao" ref="bookDao"/>
</bean>
注入简单类型
<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">
                <constructor-arg name="bookDao" value="xxxx"/>
</bean>

由于使用了name属性使得耦合度高,所以有以下两种方法解耦。

<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">
                <constructor-arg type="int" value=""/>
</bean>
<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">
                <constructor-arg index=0 value=""/>
</bean>

强制依赖使用构造器进行,使用setter注入可能导致null

可选依赖使用setter注入进行,灵活性强

依赖自动装配

xml配置

<bean id="bookService" class="com.johnnycv.service.impl.BookServiceImpl">

获取Bean

BookDao bookDao = (BookDao)ctx.getBean("bookDao");
BookDao bookDao = ctx.getBean("bookDao",BookDao.class);
BookDao bookDao = ctx.getBean(BookDao.class)

注解开发

注解开发定义bean

核心配置文件中:

<context:component-scan base-package="com.johnnycv.dao.impl"/>

使用@Component定义Bean

@Componet("bookDao")
public class BookDaoImpl implements BookDao{
}

@Componet
public class BookServiceImpl implements BookService{
}

纯注解开发

package com.johnnycv.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan({"com.johnnycv",})
public class SpringConfig {
}

应用类

package com.johnnycv;

import com.johnnycv.config.SpringConfig;
import com.johnnycv.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class App1 {
    public static void main(String[] args) {
        ApplicationContext ctx  = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao);
    }
}

自动装配

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
}

//相同类型Bean
@Autowired
@Qualifier("bookDao2")
    private BookDao bookDao;


//简单类型
 @Value("Johnny")
    private String name;

#调用属性元替换简单数据类型的注入

//现在配置类中添加
@PropertySource("jdbc.properties")

//类中写为
@Value("${name}")
private String name;

jdbc.properties为

name=johnnycv888

第三方Bean管理

@Configuration
@ComponentScan("com.johnnycv")
public class SpringConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setPassword();
        ds.setUsername();
        ds.setUrl();
        ds.setDriverClassName();
        return ds;
    }
}

在方法前面加上bean表示返回值为一个bean

@Component是类注解

同时可以通过另外一个类来管理bean方法,这样就可以不用写在SpringConfig类中

//在SpirngConfig中添加Import注解
@Configuration
@ComponentScan("com.johnnycv")
@Import({JdbcConfig.class})
public class SpringConfig {
}

//在JdbcConfig中写为
package com.johnnycv.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;


public class JdbcConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setPassword();
        ds.setUsername();
        ds.setUrl();
        ds.setDriverClassName();
        return ds;
    }
}

如果Config文件中Bean方法需要简单参数就直接使用value给成员变量赋值,再使用成员变量作为参数使用方法。

如果Config文件中需要引用类型,要在方法需要的参数列表中加入需要的参数,并且这个参数需要是一个bean才能通过自动装配给得到,所以JdbcConfig类就变为

public class JdbcConfig {
    @Bean
    public DataSource dataSource(BookDao bookDao){
        DruidDataSource ds = new DruidDataSource();
        ds.setPassword();
        ds.setUsername();
        ds.setUrl();
        ds.setDriverClassName();
        return ds;
    }
}
0

评论区