Spring——注解

目录

1.注解开发定义bean

1.1注解开发

衍生注解(功能完全一样)

1.2 纯注解开发(Spring3. 0升级了纯注解开发模式)

2.bean管理

        单例模式,init()方法执行一次,destory()方法执行一次!!!

        非单例模式,init()方法执行一次,不会执行 destory()方法!!!

3.依赖注入

3.1引用类型的依赖注入

没有相同类型的Bean,默认根据类型装配

有相同类型的Bean,必须根据名称装配

3.2 简单类型的依赖注入

4.管理第三方Bean

4.1注解开发管理第三方Bean

4.2第三方Bean注入资源

4.2.1第三方Bean注入基本类型的资源

4.2.2第三方Bean注入引用类型的资源 

5.XML配置比对注解配置


1.注解开发定义bean

1.1注解开发

@Component("bookDao")
public class BookDaoImpl implements BookDao {

    public void print() {
        System.out.println("BookDaoImp print()");
    }
}

@Component
public class BookServiceImp implements BookService {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void print() {
        System.out.println("BookServiceImp print()");
    }
}


public class App {
    public static void main(String[] args) {
        //1.获取IoC容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        //2.获取Bean对象
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");//注解指定名称
        BookService bookService = ctx.getBean(BookService.class);//注解没有指定名称

        bookService.print();
        bookDao.print();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
">
    <!--包扫描-->
    <context:component-scan base-package="com.dao.impl"/>
    <context:component-scan base-package="com.service.impl"/>

</beans>

衍生注解(功能完全一样)

1.2 纯注解开发(Spring3. 0升级了纯注解开发模式)

//纯注解开发

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


public class App2 {
    public static void main(String[] args) {
        //1.加载配置类
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2.获取Bean对象
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");//注解指定名称
        BookService bookService = ctx.getBean(BookService.class);//注解没有指定名称

        bookService.print();
        bookDao.print();
    }
}

2.bean管理


 

 单例模式,init()方法执行一次,destory()方法执行一次!!!

@Component("bookDao")
public class BookDaoImpl implements BookDao {

    @PostConstruct//bean生命周期的方法:在构造方法之后
    public void init(){
        System.out.println("init...");
    }

    @PreDestroy//bean生命周期的方法:彻底销毁之前
    public void destory(){
        System.out.println("destory...");
    }

    public void print() {
        System.out.println("BookDaoImp print()");
    }
}


//纯注解开发
public class App2 {
    public static void main(String[] args) {
        //1.加载配置类
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2.获取Bean对象
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        System.out.println(bookDao);

        ctx.registerShutdownHook();


        //单例模式下的控制台输出
        //init...      //加载配置类的时候执行一次
        //BookDaoImp print()
        //destory...
    }
}

 非单例模式,init()方法执行一次,不会执行 destory()方法!!!

@Component("bookDao")
@Scope("prototype")//非单例
public class BookDaoImpl implements BookDao {

    @PostConstruct//bean生命周期的方法:在构造方法之后
    public void init(){
        System.out.println("init...");
    }

    @PreDestroy//bean生命周期的方法:彻底销毁之前
    public void destory(){
        System.out.println("destory...");
    }

    public void print() {
        System.out.println("BookDaoImp print()");
    }
}


//纯注解开发
public class App2 {
    public static void main(String[] args) {
        //1.加载配置类
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2.获取Bean对象
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");

        System.out.println(bookDao);

        ctx.registerShutdownHook();


        //非单例模式下的控制台输出
        //init...      //加载配置类的时候执行一次
        //init...      //获取Bean对象的时候执行一次
        //BookDaoImp print()
    }
}

单例模式是将bean 放到缓存池中,所以会执行destroy。多例是为调用者创建bean ,然后就不管了,所以不会执行destroy

3.依赖注入

3.1引用类型的依赖注入

没有相同类型的Bean,默认根据类型装配

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


@Repository  //数据层的@Component
public class UserDaoImpl implements UserDao {
    public void print() {
        System.out.println("UserDaoImpl print()");
    }
}


@Service  //业务层的@Component
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    public void print() {
        System.out.println("UserServiceImpl print()");
        userDao.print();
    }
}


//纯注解开发,自动装配
public class App3 {
    public static void main(String[] args) {
        //1.加载配置类
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2.获取Bean对象
        UserService userService = ctx.getBean(UserService.class);

        userService.print();
    }
}

有相同类型的Bean,必须根据名称装配

@Repository("brandDao")
public class BrandDaoImpl implements BrandDao {
    public void print() {
        System.out.println("BrandDaoImpl print()");
    }
}

@Repository("brandDao2")
public class BrandDaoImpl2 implements BrandDao {
    public void print() {
        System.out.println("BrandDaoImpl2 print()");
    }
}

@Service
public class BrandServiceImpl implements BrandService{

    @Autowired
    @Qualifier("brandDao2")
    private BrandDao brandDao;

    public void print() {
        System.out.println("BrandServiseImpl print()");
        brandDao.print();
    }
}

//纯注解开发,自动装配
public class App4 {
    public static void main(String[] args) {
        //1.加载配置类
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2.获取Bean对象
        BrandService brandService = ctx.getBean(BrandService.class);

        brandService.print();
    }
}

3.2 简单类型的依赖注入

#这是配置文件UserDao.properties
name=zhangsan
@Configuration//表示这是一个配置类
@ComponentScan({"com.dao","com.service"})//包扫描
@PropertySource("UserDao.properties")//加载配置文件
public class SpringConfig {
}


@Repository  //数据层的@Component
public class UserDaoImpl implements UserDao {
//    @Value("zhangsan") //自动装配简单类型,直接赋值
    @Value("${name}")//自动装配简单类型,从配置文件中读取
    private String name;

    public void print() {
        System.out.println("UserDaoImpl print()");
        System.out.println("name:"+name);
    }
}



@Service  //业务层的@Component
public class UserServiceImpl implements UserService {
    @Autowired //自动装配引用类型
    private UserDao userDao;
    public void print() {
        System.out.println("UserServiceImpl print()");
        userDao.print();
    }
}



//纯注解开发,自动装配简单类型
public class App5 {
    public static void main(String[] args) {
        //1.加载配置类
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

        //2.获取Bean对象
        UserService userService = ctx.getBean(UserService.class);

        userService.print();
        //UserServiceImpl print()
        //UserDaoImpl print()
        //name:zhangsan
    }
}

4.管理第三方Bean

4.1注解开发管理第三方Bean

public class JdbcConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/itcast?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("1234");
        return druidDataSource;
    }
}


@Configuration
@Import(JdbcConfig.class)
public class SpringConfig {
}


public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        DataSource bean = ctx.getBean(DataSource.class);
        System.out.println(bean);

    }
}

 4.2第三方Bean注入资源

4.2.1第三方Bean注入基本类型的资源

方式一:直接赋值

//简单类型的依赖注入
public class JdbcConfig2 {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean
    @Value("com.mysql.cj.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/itcast?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC")
    private String url;
    @Value("root")
    private String userName;
    @Value("1234")
    private String passWord;

    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(userName);
        druidDataSource.setPassword(passWord);
        return druidDataSource;

    }
}


@Configuration
@Import(JdbcConfig2.class)
public class SpringConfig2 {
}



public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig2.class);
        DataSource bean = ctx.getBean(DataSource.class);
        System.out.println(bean);

    }
}

方式二:加载配置文件

#这是DataSource的配置文件dataSource.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/itcast?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
userName=root
passWord=1234

//简单类型的依赖注入
@PropertySource("dataSource.properties")//加载配置文件
public class JdbcConfig4 {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean
    @Value("${driver}")
    private String driver;
    @Value("${url}")
    private String url;
    @Value("${userName}")
    private String userName;
    @Value("${passWord}")
    private String passWord;

    @Bean
    public DataSource dataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(userName);
        druidDataSource.setPassword(passWord);
        return druidDataSource;

    }
}


@Configuration
@Import(JdbcConfig4.class)
public class SpringConfig4 {
}



public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig4.class);
        DataSource bean = ctx.getBean(DataSource.class);
        System.out.println(bean);

    }
}

4.2.2第三方Bean注入引用类型的资源 

public class JdbcConfig3 {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个bean

    @Bean
    public DataSource dataSource(UserDao userDao) {
        //引用类型的依赖注入
        System.out.println(userDao);
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;

    }
}


@Configuration
@Import(JdbcConfig2.class)
@ComponentScan("com.dao")//要能扫描到依赖的Bean
public class SpringConfig3 {
}


@Repository
public class UserDaoImpl implements UserDao {

}


public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);
        DataSource bean = ctx.getBean(DataSource.class);
        System.out.println(bean);

    }
}

5.XML配置比对注解配置

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值